stk/0000755000000000000000000000000013156161544006553 5ustar stk/CITATION0000644000000000000000000000132713156161544007713 0ustar -------------------------------------------------------------------- To cite this release of STK in publications use: Julien Bect, Emmanuel Vazquez and others (2017). STK: a Small (Matlab/Octave) Toolbox for Kriging. Release 2.5. URL http://kriging.sourceforge.net A BibTeX entry for LaTeX users is: @misc{, author = {Bect, Julien and Vazquez, Emmanuel and others}, title = {{STK}: a {S}mall ({M}atlab/{O}ctave) {T}oolbox for {K}riging. {R}elease 2.5}, year = {2017}, url = {http://kriging.sourceforge.net} } We have invested a lot of time and effort in the development of STK. Please cite it if you use it. -------------------------------------------------------------------- stk/COPYING0000644000000000000000000010451313156161544007612 0ustar GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . stk/ChangeLog0000644000000000000000000074031313156161544010335 0ustar 2017-09-12 Julien Bect CODING_GUIDELINES: Add (and apply) CG#12 guideline * admin/CODING_GUIDELINES: Document in CG#12 why it is better to use "hold off" instead of "cla" when calling stk_plot1d in a loop. * examples/02_design_of_experiments/stk_example_doe03.m: Apply CG#12. * examples/02_design_of_experiments/stk_example_doe05.m: Apply CG#12. CODING_GUIDELINES: Add CG#11 guideline * admin/CODING_GUIDELINES: Document in CG#11 why horzcat and vertcat must be called explicitely. 2017-09-11 Julien Bect Workaround for get (0, 'Format') compatibility issue * misc/text/stk_disp_getformat.m: New function to get 'Format' and 'FormatSpacing' properties in a Matlab/Octave comaptible way. * misc/text/stk_disp_isloose.m: Rewrite using the new function. * admin/octpkg/INDEX: Add new function to the INDEX. * arrays/@stk_dataframe/disp.m: Use the new function. * arrays/@stk_dataframe/stk_sprintf.m: Idem. * arrays/@stk_factorialdesign/stk_factorialdesign.m: Itou. 2017-09-10 Julien Bect Raise Octave version requirement to 3.6 * README.md: Indicate that STK is tested to work on "GNU Octave 3.6.2 or newer", which corresponds to the version currently available in Debian old-old-stable, a.k.a. Wheezy. * admin/CODING_GUIDELINES: Update coding guidelines. * admin/build_tools/build_octpkg.m: Set octave depencency version to 3.6.0 in the DESCRIPTION file. * arrays/@stk_dataframe/stk_sprintf.m: Remove hacks. * arrays/@stk_dataframe/subsasgn.m: Remove hacks. * arrays/@stk_factorialdesign/subsasgn.m: Remove hacks. * arrays/generic/stk_sprintf.m: Remove hacks. * misc/error/stk_error.m: Remove hacks. * misc/mole/quantile/quantile.m: Remove hacks. * stk_init.m: Remove hacks. * utils/stk_plot1d.m: Remove hacks. * arrays/@stk_dataframe/isequal.m: Remove overloaded isequal function, no longer needed. * arrays/@stk_factorialdesign/isequal.m: Idem. * core/@stk_kreq_qr/isequal.m: Idem. * core/@stk_model_gpposterior/isequal.m: Idem. * lm/@stk_lm_affine/isequal.m: Idem. * lm/@stk_lm_constant/isequal.m: Idem. * lm/@stk_lm_cubic/isequal.m: Idem. * lm/@stk_lm_matrix/isequal.m: Idem. * lm/@stk_lm_null/isequal.m: Idem. * lm/@stk_lm_quadratic/isequal.m: Idem. * misc/optim/@stk_optim_baseclass/isequal.m: Idem. * misc/optim/@stk_optim_fmincon/isequal.m: Idem. * misc/optim/@stk_optim_fminsearch/isequal.m: Idem. * misc/optim/@stk_optim_octavesqp/isequal.m: Idem. * misc/parallel/@stk_parallel_engine_none/isequal.m: Idem. * misc/parallel/@stk_parallel_engine_parfor/isequal.m: Idem. * admin/octpkg/INDEX: Update INDEX. * admin/octpkg/patches/remove-buildmex.patch: Update patch. * admin/octpkg/patches/remove-testprivatemex.patch: Update patch. * admin/octpkg/patches/stk-init-rmpath-cleanup.patch: Update patch. 2017-09-07 Julien Bect stk_plot_shadedci.m: Use area instead of fill for old Octave/Matlab * misc/plot/stk_plot_shadedci.m: Use area instead of fill for old versions of Octave and Matlab. 2017-09-05 Julien Bect stk_runtests.m: In Octave, check that __run_test_suite__ exists * misc/test/stk_runtests.m: In Octave, check that __run_test_suite__ exists before actually trying to call it. 2017-09-04 Julien Bect stk_sampcrit_ei_eval.m: Remove deprecated calling forms * sampling/stk_sampcrit_ei_eval.m: Remove deprecated calling forms. Make halfpintl public, with an stk_ prefix * sampling/private/halfpintl.m: Remove from private directory. * sampling/stk_halfpintl.m: Renamed from halfpintl.m. * admin/octpkg/INDEX: Expose stk_halfpintl in the INDEX. * sampling/stk_sampcrit_akg_eval.m: Update. * admin/octpkg/patches/comment-out-unit-tests-in-private-functions.patch: Remove. * admin/octpkg/patches/series: Update. Use Octave's native test function on Octave * misc/test/stk_test.m: Use Octave's native test function on Octave. * misc/test/stk_runtests.m: Similarly, use Octave's native __run_test_suite__ function when running on Octave. * admin/octpkg/patches/use-native-test-function.patch: Remove patch. * admin/octpkg/patches/series: Remove patch. * admin/octpkg/INDEX: Add stk_test to the INDEX. 2017-09-01 Julien Bect Multiply/divide an stk_dataframe object by a scalar * arrays/@stk_dataframe/mtimes.m: Implement a special case for the multiplication of an stk_dataframe object by a numerical scalar. * arrays/@stk_dataframe/mldivide.m: Idem for left division. * arrays/@stk_dataframe/mrdivide.m: Idem for right division. Overload left/right matrix division for stk_dataframe objects * arrays/@stk_dataframe/mldivide.m: New function. * arrays/@stk_dataframe/mrdivide.m: New function. * admin/octpkg/INDEX: Add new functions to the INDEX. stk_benchmark_predict.m: The boxplot function might be unavailable * misc/benchmarks/stk_benchmark_predict.m: Wrap call to boxplot in try-catch block, since the boxplot function might be unavailable. @stk_sampcrit_ei/set.m: Remove unnecessary assert * sampling/@stk_sampcrit_ei/set.m: Remove unnecessary assert, since only scalar output models are supported in STK at this time. Remove support for old-style .a structures * arrays/@stk_dataframe/private/get_column_number.c: Remove support for old-style .a structures. * misc/dist/stk_gpquadform.m: Idem. * arrays/@struct/double.m: Removed. * arrays/@struct/stk_boundingbox.m: Removed. * arrays/@struct/stk_length.m: Removed. * admin/octpkg/INDEX: Update. * arrays/@stk_dataframe/subsref.m: Remove unit tests. * core/@stk_model_gpposterior/stk_predict.m: Idem. * core/stk_predict.m: Idem. * arrays/generic/stk_feval.m: Idem. * covfcs/stk_expcov_aniso.m: Idem. * covfcs/stk_gausscov_aniso.m: Idem. * covfcs/stk_materncov32_aniso.m: Idem. * covfcs/stk_sphcov_aniso.m: Idem. * NEWS.md: Advertise. 2017-08-31 Julien Bect stk_generate_samplepaths.m: Remove xtest for ticket #14 * utils/stk_generate_samplepaths.m: Remove xtest for ticket #14 since the problem as been solved, as expected, by the previous commit. Exact predictions at obs points for noiseless models (ticket #49) * core/@stk_model_gpposterior/stk_predict.m: Ensure exact prediction at observation points for noiseless models. * core/stk_predict.m: Change xtest to test. * sampling/@stk_sampcrit_eqi/feval.m: Fix EQI computation at the points where the variance is zero. Insert HTML version of AUTHORS.md in the documentation * admin/build_tools/generate_htmldoc.m: Insert HTML version of AUTHORS.md in the documentation. INDEX: Add @stk_factorialdesign/ismember * admin/octpkg/INDEX: INDEX: Add @stk_factorialdesign/ismember. Convert AUTHORS to markdown. * AUTHORS: Renamed to AUTHORS.md * AUTHORS.md: Renamed from AUTHORS, and converted to md syntax. * admin/find_nonstandard_characters.sh: Scan AUTHORS.md as well. * admin/build_tools/build_octpkg.m: Update. * README.md: Update. * admin/RELEASE.md: Update. NEWS.md: Write Matérn with an accent on the "e" * NEWS.md: Write Matérn with an accent on the "e", since we are already using UTF-8 in this file anyway (for the umlaut on the "u" of Müller). 2017-08-30 Julien Bect Overload ismember for stk_factorialdesign objects (ticket #29) * arrays/@stk_factorialdesign/ismember.m: New function 2017-08-29 Julien Bect stk_sampcrit_ehvi_eval.m: Avoid OOM errors (ticket #48) * sampling/stk_sampcrit_ehvi_eval.m: Process batches of rectangles to avoid OOM errors. Adapt html doc generation to changes in generate_html (fix) * admin/build_tools/get_allpurpose_html_options.m: Fix earlier commit (a12753859a6a) with the same name. generate_htmldoc.m: Use HTML version of NEWS.md (ticket #61) * admin/build_tools/generate_htmldoc.m: Insert HTML version of NEWS.md, produced by markdown, inside NEWS.html. NEWS.md: Fix markdown formatting * NEWS.md: Fix markdown formatting 2017-08-28 Julien Bect Convert NEWS to markdown formatting (ticket #60) * NEWS.md: Convert NEWS to markdown formatting and rename to NEWS.md. * NEWS: Removed. * admin/build_tools/build_octpkg.m: Rename NEWS to NEWS.md. 2017-08-26 Julien Bect @stk_dataframe/ismember.m: Do not assume 'rows' (ticket #50) * arrays/@stk_dataframe/ismember.m: Do not assume 'rows', in order to have a behaviour that is consistent with that of the base function on numerical matrices. Remove isoctave function * misc/mole/isoctave/isoctave.m: Deleted. * stk_init.m: Use exist directly. Remove a few lines related to the isoctave function. * misc/mole/graphics_toolkit/graphics_toolkit.m: Use exist directly. * misc/optim/@stk_optim_octavesqp/stk_optim_octavesqp.m: Use exist directly. * misc/options/stk_options_set.m: Use exist directly. * misc/parallel/stk_parallel_start.m: Use exist directly. * misc/test/stk_test.m: Use exist directly. * admin/octpkg/patches/remove-buildmex.patch: Refresh patch. * admin/octpkg/patches/remove-testprivatemex.patch: Refresh patch. * admin/octpkg/patches/stk-init-rmpath-cleanup.patch: Refresh patch. * admin/octpkg/patches/use-native-test-function.patch: Refresh patch. CG#10: Disable TeX interpreter for variable names * admin/CODING_GUIDELINES: Introduce new coding guideline, CG#10, recommending to disable the TeX interpreter for variable names. * arrays/@stk_dataframe/plot.m: Follow CG#10. * arrays/@stk_dataframe/plotmatrix.m: Follow CG#10. * arrays/@stk_factorialdesign/private/plot_surfmeshcontour.m: Follow CG#10. * arrays/@stk_hrect/axis.m: Follow CG#10. 2017-08-25 Julien Bect Adapt html doc generation to changes in generate_html * admin/build_tools/get_allpurpose_html_options.m: Adapt html doc generation to changes in generate_html. 2017-07-25 Julien Bect @stk_dataframe/bsxfun.m: Fix colnames/rownames selection * arrays/@stk_dataframe/bsxfun.m: Fix colnames/rownames selection. 2017-07-24 Julien Bect @stk_model_gpposterior/stk_predict_leaveoneout.m: Ensure var >= 0 * core/@stk_model_gpposterior/stk_predict_leaveoneout.m: Make sure that variances will always be non-negative. Benchmark virtual LOO-CV speedup * misc/benchmarks/stk_benchmark_loocv.m: New benchmark script to evaluate to speedup brought by the implementation of virtual LOO cross validation. Move some LOO-CV unit tests * core/stk_predict_leaveoneout.m: Move unit tests for correctness of virtual LOO-CV formulas to @stk_model_gpposterior/stk_predict_leaveoneout.m. * core/@stk_model_gpposterior/stk_predict_leaveoneout.m: Here. Keep a copy of the original "direct" implementation of LOO-CV. * core/@stk_model_gpposterior/stk_predict_leaveoneout_direct.m: Internal function, which is simply a copy of our original, "direct" implementation of LOO-CV. Can be used to check correctness of virtual LOO formulas, and for benchmarking. * admin/octpkg/INDEX: Hide internal function from the index. 2017-07-23 Rémi Stroh stk_predict_leaveoneout.m: Use virtual Leave-One-Out formula (ticket #35) * core\@stk_model_gpposterior\stk_predict_leaveoneout.m: Replace the naive expression of the cross-validation, by the virtual leave-one-out formula. * core\stk_predict_leaveoneout.m: Add a test to check virtual LOO formula. 2017-07-12 Julien Bect stk_benchmark_predict.m: New function to benchmark stk_predict * misc/benchmarks/stk_benchmark_predict.m: New function to benchmark stk_predict. stk_benchmark_.m: New function to help benchmark computation times * misc/benchmarks/stk_benchmark_.m: New function to help benchmark computation times. 2017-07-10 Julien Bect stk_example_misc04.m: Work-around for Octave bug #49267. * examples/03_miscellaneous/stk_example_misc04.m: Work-around for Octave bug #49267. New octpkg patch to comment out unit tests in private functions * admin/octpkg/patches/comment-out-unit-tests-in-private-functions.patch: New octpkg patch to comment out unit tests in private functions. * admin/octpkg/patches/series: Add new test to the series. 2017-07-09 Julien Bect stk_predict_leaveoneout.m: Update help text * core/stk_predict_leaveoneout.m: Update help text. Set release date based on hg date in the build process * Makefile: Pass hg date to build_* functions. * admin/build_tools/build_allpurpose.m: Use hg date. * admin/build_tools/build_octpkg.m: Use hg date. * admin/build_tools/copy_citation.m: Use hg date. * admin/build_tools/copy_readme.m: Use hg date. 2017-07-05 Julien Bect stk_sampcrit_akg_eval.m: Fix unit tests * sampling/stk_sampcrit_akg_eval.m: Fix unit tests. stk_dominatedhv_mex.c: Avoid "uninitialized variable" warnings * misc/pareto/private/stk_dominatedhv_mex.c: Avoid "uninitialized variable" compiler warnings. CG#09: Use erfcinv when norminv fails (ticket #78) * admin/CODING_GUIDELINES: Introduce new coding guideline, CG#09, recommending to use erfcinv directly when norminv fails. * sampling/@stk_sampcrit_eqi/set.m: Implement CG#09. 2017-07-04 Rémi Stroh @stk_sampcrit_eqi\set.m: Change "norminv" by "erfcinv" (ticket #78) * sampling\@stk_sampcrit_eqi\set.m: Replace the use of "norminv" function, available only with the statistical toolbox, by an expression using "erfcinv", a special basis function. utils\stk_plot1d.m: Correct a bug * utils\@stk_plot1d.m: Correct a bug, in the case where xt is empty. utils/@stk_plot1d: sort data before plotting * utils/@stk_plot1d: sort xt as increasing order before plotting. The output vectors zt, zp and zsim are similarly modified before their drawings. arrays/@stk_dataframe: Overload 3 additional unitary test functions * arrays/@stk_dataframe/isnan.m: New overloaded test function * arrays/@stk_dataframe/isinf.m: Idem. * arrays/@stk_dataframe/isfinite.m: Idem. 2017-07-03 Julien Bect stk_param_estim.m: Do not use model.param as a starting point * param/estim/stk_param_estim.m: Do not use model.param as a starting point; if param0 is not provided, call stk_param_init. Modify documentation accordingly; it wasn't up-to-date anyway. 2017-07-02 Julien Bect @stk_model_gpposterior/stk_predict.m: Skip main loop when nt == 0 * core/@stk_model_gpposterior/stk_predict.m: Skip main loop when nt == 0. stk_predict_leaveoneout.m: nargout == 0 => create plots * core/@stk_model_gpposterior/stk_predict_leaveoneout.m: Calling stk_predict_leaveoneout with no output arguments now automatically create two cross-validation diagnostics in two subplots: prediction VS observations, left panel, and normalized + residuals, right panel. * core/stk_predict_leaveoneout.m: Do not change nargout when calling overloaded method. * examples/01_kriging_basics/stk_example_kb10.m: Advertise the new syntax at the end of the script. @stk_dataframe/stk_dataframe.m: Accept char colnames/rownames * arrays/@stk_dataframe/stk_dataframe.m: Tolerate char arguments instead of cells for column and row names in the special case where the expected number of elements is one. 2017-07-01 Julien Bect stk_plot_probdom2d.m: New function * utils/stk_plot_probdom2d.m: New function to represent the uncertainty about a 2D Pareto front. This function is currently considered experimental and should not be expected to produce a reliable representation of the uncertainty for difficult or high-dimensional optimization problems. * examples/03_miscellaneous/stk_example_misc04.m: Update the example to use the new function. * admin/octpkg/INDEX: Add the new function to the INDEX. @stk_model_gpposterior/stk_generate_samplepaths.m: Overload base * core/@stk_model_gpposterior/stk_generate_samplepaths.m: New function, overload base STK function. Remove all occurences of response_name * core/stk_model.m: Do not mention response_name as an optional field, since it isn't used anywhere in STK now. * examples/03_miscellaneous/stk_example_misc04.m: No more response_name. Return a plain numerical array from stk_generate_samplepaths * utils/stk_generate_samplepaths.m: Return a plain double precision numerical array; no more data frames here. * arrays/@stk_dataframe/stk_generate_samplepaths.m: Removed. * examples/03_miscellaneous/stk_example_misc04.m: Updated. * admin/octpkg/INDEX: Update the INDEX. @stk_model_gpposterior/stk_model_gpposterior.m: Check xi * core/@stk_model_gpposterior/stk_model_gpposterior.m: Check the number of columns of input argument xi. Move important plotting functions to 'utils' directory * misc/plot/stk_plot1d.m: Moved to 'utils' directory. * misc/plot/stk_plot_histnormres.m: Idem. * misc/plot/stk_plot_predvsobs.m: Idem. * utils/stk_plot1d.m: Moved from 'misc/plot' directory. * utils/stk_plot_histnormres.m: Idem. * utils/stk_plot_predvsobs.m: Idem. 2017-06-29 Julien Bect Add a new test case named 'truss3' * examples/test_functions/stk_testcase_truss3.m: New function. * examples/test_functions/stk_testfun_truss3_bb.m: New function. * examples/test_functions/stk_testfun_truss3_vol.m: New function. * admin/octpkg/INDEX: Add new functions to the INDEX. stk_plot_predvsobs.m: Lowercase labels * misc/plot/stk_plot_predvsobs.m: Lowercase labels. 2017-06-28 Julien Bect Change mnemonic 'IncorrectArgument' to 'InvalidArgument' * arrays/@stk_dataframe/cat.m: Change mnemonic 'IncorrectArgument' to 'InvalidArgument', since both of them were used interchangeably. * arrays/@stk_dataframe/find.m: Idem. * arrays/@stk_factorialdesign/private/plot_surfmeshcontour.m: Idem. * misc/dist/stk_gpquadform.m: Idem. * misc/pareto/stk_dominatedhv.m: Idem. * param/estim/stk_param_estim.m: Idem. * param/estim/stk_param_init.m: Idem. * sampling/stk_sampling_olhs.m: Idem. * sampling/stk_sampling_sobol.m: Idem. @stk_dataframe/bsxfun.m: Remove annoying warnings * arrays/@stk_dataframe/bsxfun.m: Take the column names (or row names) from the first argument in case of disagreement, as in R. Remove the annoying warnings. 2017-06-27 Julien Bect @stk_dataframe/set.m: Backout revision 29c5b2515988 * arrays/@stk_dataframe/set.m: *Do not* reject colnames and rownames values with an insufficient number of elements. @stk_dataframe/subsasgn.m: Add (currently failing) unit tests * arrays/@stk_dataframe/subsasgn.m: Add (currently failing) unit tests for the insertion of row/column names on data frames that have none. @stk_model_gpposterior/stk_model_gpposterior.m: Check 'prior_model' arg * core/@stk_model_gpposterior/stk_model_gpposterior.m: Check that input argument 'prior_model' is a structure. Logical-valued operators now return logical values on df as well * arrays/@stk_dataframe/and.m: Return logical result. * arrays/@stk_dataframe/eq.m: Idem. * arrays/@stk_dataframe/ge.m: Idem. * arrays/@stk_dataframe/gt.m: Idem. * arrays/@stk_dataframe/le.m: Idem. * arrays/@stk_dataframe/lt.m: Idem. * arrays/@stk_dataframe/ne.m: Idem. * arrays/@stk_dataframe/or.m: Idem. * arrays/@stk_dataframe/xor.m: Idem. * arrays/@stk_dataframe/not.m: New function. * admin/octpkg/INDEX: Add new function to the INDEX. 2017-06-26 Rémi Stroh stk_distrib_normal_crps.m: Make unit test deterministic (ticket #77) * misc\distrib\stk_distrib_normal_crps.m: Replace the random selection of data with fixed data. stk_distrib_normal_crps.m: Change the final test (ticket #77) * misc\distrib\stk_distrib_normal_crps.m: Modify the last test to support compatibility with older versions of Matlab and Octave. 2017-06-26 Julien Bect @stk_dataframe/set.m: Check colnames and rownames values more strictly * arrays/@stk_dataframe/set.m: Reject colnames and rownames values with an insufficient number of elements. @stk_dataframe/subsref.m: Fix empty indexing * arrays/@stk_dataframe/subsref.m: Fix empty indexing. @stk_dataframe/stk_dataframe.m: Fix typo * arrays/@stk_dataframe/stk_dataframe.m: Fix typo. 2017-06-25 Julien Bect @stk_dataframe/fieldnames.m: Add row names to the list * arrays/@stk_dataframe/fieldnames.m: Add row names. Also, do not include empty row or column names in the list. 2017-06-24 Julien Bect stk_sampling_sobol.m: Fix help text * sampling/stk_sampling_sobol.m: Fix help text. build_octpkg.m: Add 'License:' in DESCRIPTION * admin/build_tools/build_octpkg.m: Add 'License:' in DESCRIPTION. * admin/build_tools/generate_htmldoc.m: Remove 'Read License" subst. @stk_dataframe/stk_sprintf.m: Improve formatting for empty data frames * arrays/@stk_dataframe/stk_sprintf.m: Improve formatting for empty data frames. In particular, display column names or row names if appropriate. * arrays/@stk_dataframe/disp.m: Source formatting. * arrays/generic/stk_sprintf.m: Fix help text. Source formatting. 2017-06-23 Julien Bect stk_dataframe.m: Guess the size when the first input is empty * arrays/@stk_dataframe/stk_dataframe.m: Deduce the number of columns and rows from the length of colnames and rownames, respectively, when the first input argument is empty. Note that this patch changes the object generated by the default constructor. 2017-06-20 Julien Bect stk_dominatedhv.m: Accept @stk_dataframe inputs * misc/pareto/stk_dominatedhv.m: Tolerate any kind of input argument that can be converted to a double precision matrix, in particular @stk_dataframe objects. 2017-06-16 Julien Bect Don't use ~ to ignore output arguments (see CG#07) * admin/CODING_GUIDELINES: Improve CG#07 * sampling/stk_sampcrit_akg_eval.m: Apply CG#07 * sampling/stk_sampling_nesteddesign.m: Apply CG#07 * sampling/stk_sampling_nestedlhs.m: Apply CG#07 @stk_sampcrit_eqi/disp.m: Fix display bug * sampling/@stk_sampcrit_eqi/disp.m: Fix display bug for the case where point_batch_size is a function handle. stk_sampcrit_eqi.m: Increase unit test tolerance (ticket #76) * sampling/@stk_sampcrit_eqi/stk_sampcrit_eqi.m: Increase the numerical tolerance in two unit tests. stk_sampcrit_eqi.m: Fix one unit test (ticket #76) * sampling/@stk_sampcrit_eqi/stk_sampcrit_eqi.m: Fix one unit test; in Octave, str2func fails on phony function names. 2017-06-15 Julien Bect stk_sampcrit_akg_eval.m: Improve numerical robustness * sampling/stk_sampcrit_akg_eval.m: Mitigate the effect of small inaccurate covariance values on the computation of the slopes. halfpintl.m: Fix a bug affecting slope equality cases * sampling/private/halfpintl.m: Fix a bug affecting slope equality cases. stk_plot_shadedci.m: Use area when fill fails (ticket #75) * misc/plot/stk_plot_shadedci.m: fill does not accept a axis handle argument in Matlab prior to R2016a. Use area as we were doing before when fill fails. 2017-06-12 Julien Bect stk_plot_shadedci.m: Use fill instead of area * misc/plot/stk_plot_shadedci.m: Recent changes in Matlab R2017a have altered the behaviour of area. Using fill is cleaner. stk_plot_shadedci.m: Use three shaded areas * misc/plot/stk_plot_shadedci.m: Use three shaded areas to visualize three levels of pointwise confidence intervals at once. 2017-06-07 Julien Bect Optimize for speed * core/@stk_kreq_qr/get.m: Use a simple switch. * core/@stk_model_gpposterior/stk_predict.m: Call get directly. * sampling/@stk_sampcrit_akg/feval.m: Call get directly. 2017-06-06 Julien Bect @stk_model_gpposterior/stk_predict.m: Improve error messages * core/@stk_model_gpposterior/stk_predict.m: Improve the error messages corresponding to the case where xt has an incorrect size. 2017-06-05 Julien Bect @stk_dataframe/plotmatrix.m: Overload base function * arrays/@stk_dataframe/plotmatrix.m: New function, overload base function to enrich plotmatrix graphics with variable names when possible. * admin/octpkg/INDEX: Add the new function to the index. Optimize for speed * arrays/@stk_dataframe/set_data.m: New function, fast setter. * admin/octpkg/INDEX: Add the new function to the index. * arrays/@stk_dataframe/set.m: Use set_data. * arrays/@stk_factorialdesign/set.m: Use set_data. * arrays/@stk_hrect/stk_rescale.m: Optimize for speed. * arrays/@stk_hrect/subsasgn.m: Optimize for speed. * sampling/stk_sampling_randunif.m: Optimize for speed. * sampling/stk_sampling_regulargrid.m: Optimize for speed. 2017-06-03 Julien Bect Optimize a few functions for speed * arrays/@stk_dataframe/stk_dataframe.m: Optimize * arrays/@stk_factorialdesign/stk_factorialdesign.m: Optimize * arrays/@stk_hrect/stk_rescale.m: Optimize * sampling/stk_sampling_randunif.m: Optimize * sampling/stk_sampling_regulargrid.m: Optimize * admin/octpkg/patches/matlab-graphics-axis-Axes.patch: Update Upcast objects from derived classes to stk_dataframe * arrays/@stk_factorialdesign/stk_dataframe.m: New function. * arrays/@stk_hrect/stk_dataframe.m: New function. * admin/octpkg/INDEX: Add new functions to the index. 2017-05-29 Julien Bect @stk_dataframe/find.m: Overload base function * arrays/@stk_dataframe/find.m: Overload base function to support calling find with an stk_dataframe as first input argument. * admin/octpkg/INDEX: Add new function to the index. stk_dataframe.m: Improve error messages * arrays/@stk_dataframe/stk_dataframe.m: Improve error message when either colnames or rownames has an incorrect number of elements. stk_sampcrit_akg_eval.m: Set zr_min to +Inf when zr_mean is empty * sampling/stk_sampcrit_akg_eval.m: Set zr_min to +Inf when zr_mean is empty. stk_hrect.m: Preserve colmumns names for stk_dataframe inputs * arrays/@stk_hrect/stk_hrect.m: Preserve colmumns names when the input is an stk_dataframe object. 2017-05-28 Julien Bect stk_factorialdesign.m: Accept stk_dataframe levels * arrays/@stk_factorialdesign/stk_factorialdesign.m: Accept one-variable stk_dataframe factors and preserve column names in this case. * arrays/@stk_factorialdesign/stk_boundingbox.m: Do not assume that the cell array of levels is row-shaped. * admin/octpkg/patches/matlab-graphics-axis-Axes.patch: Update patch. stk_predict: Remove old inaccessible display_waitbar stuff * core/@stk_model_gpposterior/stk_predict.m: Remove old and inaccessible display_waitbar stuff. 2017-05-27 Julien Bect Implement the AKG criterion * sampling/stk_sampcrit_akg_eval.m: New function, this is were the actual computation of the AKG criterion happens. * sampling/private/halfpintl.m: New private function that computes the intersection of lower half-planes (equivalently, the lower envelope of a set of lines) needed in the AKG. * sampling/@stk_sampcrit_akg/stk_sampcrit_akg.m: New function. * sampling/@stk_sampcrit_akg/feval.m: New function, does some non-trivial preliminary work before calling stk_sampcrit_akg_eval. * sampling/@stk_sampcrit_akg/disp.m: New function, copied from other sampcrit classes with minor adaptations. * sampling/@stk_sampcrit_akg/get.m: New function, this is the same trivial getter as in other sampcrit classes. * sampling/@stk_sampcrit_akg/set.m: New function, contains some pre-computations that depend on the reference grid only. * examples/02_design_of_experiments/stk_example_doe05.m: Use AKG as a default, and propose EQI as an option. * admin/octpkg/INDEX: Update index with new functions. @stk_model_gpposterior/stk_make_kreq: new (internal) method * core/@stk_model_gpposterior/stk_make_kreq.m: New method. * core/@stk_model_gpposterior/stk_predict.m: Use the new method. * admin/octpkg/INDEX: Update index with new function. @stk_sampcrit_eqi: point_batch_size can also be a function * sampling/@stk_sampcrit_eqi/stk_sampcrit_eqi.m: Add unit tests. * sampling/@stk_sampcrit_eqi/set.m: Accept functions and char for the value of point_batch_size. * sampling/@stk_sampcrit_eqi/feval.m: Compute point_batch_size. Fix a spelling error (instanciated -> instantiated) * sampling/@stk_sampcrit_ei/stk_sampcrit_ei.m: Fix spelling error. * sampling/@stk_sampcrit_eqi/stk_sampcrit_eqi.m: Idem. 2017-05-25 Julien Bect Massive overhaul of sampling criterion classes * sampling/@stk_sampcrit_modelbased: Class removed * sampling/@stk_sampcrit_modelbased/feval.m: Removed * sampling/@stk_sampcrit_modelbased/get_input_data.m: Removed * sampling/@stk_sampcrit_modelbased/get_model.m: Removed * sampling/@stk_sampcrit_modelbased/get_output_data.m: Removed * sampling/@stk_sampcrit_modelbased/set_model.m: Removed * sampling/@stk_sampcrit_modelbased/stk_model_update.m: Removed * sampling/@stk_sampcrit_modelbased/stk_sampcrit_modelbased.m: Removed * sampling/@stk_sampcrit_singleobjoptim: Class removed * sampling/@stk_sampcrit_singleobjoptim/get_bminimize.m: Removed * sampling/@stk_sampcrit_singleobjoptim/get_goal.m: Removed * sampling/@stk_sampcrit_singleobjoptim/set_goal.m: Removed * sampling/@stk_sampcrit_singleobjoptim/stk_sampcrit_singleobjoptim.m: Removed * sampling/@stk_sampcrit_thresholdbasedoptim: Class removed * sampling/@stk_sampcrit_thresholdbasedoptim/disp.m: Removed * sampling/@stk_sampcrit_thresholdbasedoptim/get.m: Removed * sampling/@stk_sampcrit_thresholdbasedoptim/get_threshold_mode.m: Removed * sampling/@stk_sampcrit_thresholdbasedoptim/get_threshold_quantile_order.m: Removed * sampling/@stk_sampcrit_thresholdbasedoptim/get_threshold_value.m: Removed * sampling/@stk_sampcrit_thresholdbasedoptim/set.m: Removed * sampling/@stk_sampcrit_thresholdbasedoptim/set_goal.m: Removed * sampling/@stk_sampcrit_thresholdbasedoptim/set_model.m: Removed * sampling/@stk_sampcrit_thresholdbasedoptim/set_threshold_mode.m: Removed * sampling/@stk_sampcrit_thresholdbasedoptim/set_threshold_quantile_order.m: Removed * sampling/@stk_sampcrit_thresholdbasedoptim/set_threshold_value.m: Removed * sampling/@stk_sampcrit_thresholdbasedoptim/stk_model_update.m: Removed * sampling/@stk_sampcrit_thresholdbasedoptim/stk_sampcrit_thresholdbasedoptim.m: Removed * sampling/@stk_sampcrit_base: Class renamed to @stk_function * sampling/@stk_sampcrit_base/stk_sampcrit_base.m: Moved to @stk_function, renamed, modified * sampling/@stk_sampcrit_base/disp.m: : Moved to @stk_function and modified * sampling/@stk_sampcrit_base/display.m: Idem. * sampling/@stk_sampcrit_base/horzcat.m: Idem. * sampling/@stk_sampcrit_base/subsasgn.m: Idem. * sampling/@stk_sampcrit_base/subsref.m: Idem. * sampling/@stk_sampcrit_base/vertcat.m: Idem. * sampling/@stk_function: Replaces @stk_sampcrit_base * sampling/@stk_function/stk_function.m: Moved from @stk_sampcrit_base, renamed, modified * sampling/@stk_function/disp.m: Moved from @stk_sampcrit_base and modified * sampling/@stk_function/display.m: Idem. * sampling/@stk_function/horzcat.m: Idem. * sampling/@stk_function/subsasgn.m: Idem. * sampling/@stk_function/subsref.m: Idem. * sampling/@stk_function/vertcat.m: Idem. * sampling/@stk_function/feval.m: New method (error only) * sampling/@stk_function/get.m: New method (error only) * core/@struct/get_input_data.m: New method to support prior models defined as structures * core/@struct/get_output_data.m: Idem. * core/@struct/get_prior_model.m: Idem. * core/@struct/private/assert_struct_is_model.m: Private function used by the last three * sampling/@stk_sampcrit_ei: Complete class rewrite * sampling/@stk_sampcrit_ei/stk_sampcrit_ei.m: Entirely rewritten * sampling/@stk_sampcrit_ei/msfeval.m: Moved to feval.m * sampling/@stk_sampcrit_ei/feval.m: Moved from msfeval.m and modified * sampling/@stk_sampcrit_ei/disp.m: Moved from thresholdbasedoptim and modified * sampling/@stk_sampcrit_ei/get.m: New method (trivial getter) * sampling/@stk_sampcrit_ei/set.m: New method (non-trivial setter) * sampling/@stk_sampcrit_eqi: Complete class rewrite * sampling/@stk_sampcrit_eqi/stk_sampcrit_eqi.m: Entirely rewritten * sampling/@stk_sampcrit_eqi/msfeval.m: Moved to feval.m * sampling/@stk_sampcrit_eqi/feval.m: Moved from msfeval.m and modified * sampling/@stk_sampcrit_eqi/disp.m: Moved from thresholdbasedoptim and modified * sampling/@stk_sampcrit_eqi/get.m: New method (trivial getter) * sampling/@stk_sampcrit_eqi/set.m: New method (non-trivial setter) * examples/02_design_of_experiments/stk_example_doe05.m: Rewrite almost entirely * admin/octpkg/INDEX: Update index 2017-05-16 Julien Bect Fix object display problem (ticket #73) * misc/text/stk_disp_isloose.m: New function, to query the compact/loose display status in a Matlab/Octave compatible-way. * core/@stk_model_gpposterior/disp.m: Use the new function. * core/@stk_model_gpposterior/display.m: Idem. * sampling/@stk_sampcrit_base/disp.m: Idem. * sampling/@stk_sampcrit_base/display.m: Idem. * sampling/@stk_sampcrit_thresholdbasedoptim/disp.m: Idem. * admin/octpkg/INDEX: Add the new function to the index. 2017-05-13 Julien Bect stk_sampcrit_ehvi_eval.m: Add help text * sampling/stk_sampcrit_ehvi_eval.m: Add help text. * sampling/stk_sampcrit_ei_eval.m: Minor change in help text. * sampling/stk_sampcrit_emmi_eval.m: Minor change in help text. 2017-05-12 Julien Bect stk_distrib_normal_ei.m: Recommend to use stk_sampcrit_ei_eval * misc/distrib/stk_distrib_normal_ei.m: Recommend to use stk_sampcrit_ei_eval instead. 2017-05-12 Rémi Stroh Format help texts. * sampling/stk_sampling_nesteddesign.m: Formatting help text to follow the STK style. * sampling/stk_sampling_nestedlhs.m: Idem. 2017-05-11 Julien Bect Remove dominated solutions in MOO sampling criteria * sampling/stk_sampcrit_ehvi_eval.m: Simply add a comment. Dominated solutions were already removed by stk_dominatedhv. * sampling/stk_sampcrit_emmi_eval.m: Remove dominated solutions and duplicates, as in stk_dominatedhv. stk_sampcrit_emmi_eval.m: Improve help text * sampling/stk_sampcrit_emmi_eval.m: Improve help text. stk_sampcrit_emmi_eval.m: Use capital variable names in help text * sampling/stk_sampcrit_emmi_eval.m: Use capital variable names in help text, as everywhere else in the toolbox. stk_sampcrit_ei_eval.m: Warn about deprecated use * sampling/stk_sampcrit_ei_eval.m: Add warnings about deprecated syntaxes, that were introduced inadvertently in STK 2.4.0 and will be removed in future releases. These warnings should remain as long as we are in the 2.4.x series. 2017-05-09 Julien Bect stk_sampcrit_ei_eval.m: Add help text * sampling/stk_sampcrit_ei_eval.m: Add help text. stk_param_estim.m: Improve error message (ticket #72) * paramestim/stk_param_estim.m: Issue a better error message when LNV0 is either NaN of infinite. 2017-05-08 Julien Bect stk_sampcrit_ei_eval.m: Remove the 'goal' argument * sampling/stk_sampcrit_ei_eval.m: Remove the 'goal' argument and provide an implementation for *minimization* problems, which is the usual convention for optimization problems and which is consistent with the convention chosen for the EMMI and EHVI criteria. * examples/02_design_of_experiments/stk_example_doe03.m: Use the new syntax without the 'goal' argument, using minus signs instead. 2017-05-06 Julien Bect stk_sampcrit_ei_eval.m: New syntax * sampling/stk_sampcrit_ei_eval.m: Adopt a syntax that is consistent with the syntax of the EHVI and EMMI *_eval functions. This function was accidentally released in STK 2.4.0 with two other syntaxes, now marked as deprecated, that were never publicly documented. * examples/02_design_of_experiments/stk_example_doe03.m: Use the new syntax. Also, fix the example which was showing a minimization strategy while a comment in the source code indicated maximization. 2017-05-05 Julien Bect stk_distrib_normal_crps.m: Remove example from help text * misc/distrib/stk_distrib_normal_crps.m: Remove example from help text. The functions in misc/distrib are meant to be independent of the rest of the toolbox, we should avoid using functions from other parts of STK inside them. 2017-05-03 Rémi Stroh stk_distrib_normal_crps.m: New function to compute the Gaussian CRPS * misc/distrib/stk_distrib_normal_crps.m: New function to compute the Continuous Ranked Probability Score in the case of a Gaussian predictive density. 2017-04-27 Rémi Stroh New functions to create nested designs. * sampling/stk_sampling_nesteddesign.m: New function to create nested designs. * sampling/stk_sampling_nestedlhs.m: New function to create nested LHS. 2017-04-27 Julien Bect vertcat.m: Preserve column names when some are missing (ticket #66) * arrays/@stk_dataframe/vertcat.m: Preserve column names even if some of them are missing. vertcat.m: Do the concatenation earlier * arrays/@stk_dataframe/vertcat.m: Do the concatenation earlier to let the base vertcat function generate an error message if needed. 2017-04-26 Julien Bect stk_model_fixlm.m: Better error message (ticket #69) * core/stk_model_fixlm.m: Display a better error message when both model.lm and model.order are present, but their values are not compatible. 2017-04-19 Julien Bect stk_generate_samplepaths.m: Do not set lognoisevariance to -inf * utils/stk_generate_samplepaths.m: No need to set lognoisevariance to -inf in the noiseless case. Bring examples up to date with changes in stk_model_gpposterior * examples/02_design_of_experiments/stk_example_doe03.m: Do not modify directly the 'lognoisevariance' field of the prior. * examples/02_design_of_experiments/stk_example_doe05.m: Do not modify directly the 'param' field of the prior. stk_sampcrit_thresholdbasedoptim.m: Fix input argument processing * sampling/@stk_sampcrit_thresholdbasedoptim/stk_sampcrit_thresholdbasedoptim.m: Fix input argument processing. Reorganize parameter-related functions * param/classes: New directory, that will contain parameter classes in the future. There are no parameter classes currently, but this is the place where they will be. * paramestim/private/stk_get_optimizable_parameters.m: Moved to param/classes. * paramestim/private/stk_set_optimizable_parameters.m: Idem. * param/classes/stk_get_optimizable_parameters.m: Moved from paramestim/private. * param/classes/stk_set_optimizable_parameters.m: Idem. * paramestim/stk_param_estim.m: Moved to param/estim. * paramestim/stk_param_getdefaultbounds.m: Idem. * paramestim/stk_param_gls.m: Idem. * paramestim/stk_param_init.m: Idem. * paramestim/stk_param_init_lnv.m: Idem. * paramestim/stk_param_relik.m: Idem. * param/estim/stk_param_estim.m: Moved from paramestim/. * param/estim/stk_param_getdefaultbounds.m: Idem. * param/estim/stk_param_gls.m: Idem. * param/estim/stk_param_init.m: Idem. * param/estim/stk_param_init_lnv.m: Idem. * param/estim/stk_param_relik.m: Idem. * stk_init.m: Update the path 2017-04-18 Julien Bect Rewrite two private functions with try-catch blocks instead of tests * paramestim/private/stk_get_optimizable_parameters.m: Use a try-catch block instead of testing what the input is. * paramestim/private/stk_set_optimizable_parameters.m: Idem. Fix syntax errors * paramestim/private/stk_get_optimizable_parameters.m: Fix syntax error. * paramestim/private/stk_set_optimizable_parameters.m: Fix syntax error. 2017-04-16 Julien Bect stk_pmisclass.m: Add help text * utils/stk_pmisclass.m: Add help text. stk_pmisclass.m: Handle K22 scalar negative or null * utils/stk_pmisclass.m: Handle specifically, when K22 is scalar, the case where K22 is negative or null. 2017-03-09 Julien Bect wfg.c: Remove unused variables * misc/pareto/private/wfg.c: Remove unused variables. stk_example_doe04.m: Add help text * examples/02_design_of_experiments/stk_example_doe04.m: Add help text. stk_param_getdefaultbounds.m: Add help text * paramestim/stk_param_getdefaultbounds.m: Add help text. 2017-03-08 Julien Bect @stk_dataframe/ismember.m: Fix a bug * arrays/@stk_dataframe/ismember.m: Handle the case where A is an stk_dataframe object and B is an stk_hrect object (or any specialized stk_dataframe object that implements ismember). stk_plot_histnormres.m: Ignore infinite normalized residuals * misc/plot/stk_plot_histnormres.m: Ignore infinite normalized residuals, with a warning. 2017-02-21 Julien Bect stk_phipcrit.m: Fix a typo in the help text * misc/design/stk_phipcrit.m: Fix a typo in the help text. 2017-02-10 Julien Bect Use fminsearch for box-constrained problems as last recourse * misc/optim/@stk_optim_fminsearch/stk_minimize_boxconstrained.m: New function, which allows to use fminsearch for box-constrained problems, a as last recourse for Matlab users that have neither the Optimization toolbox nor MOSEK. * admin/octpkg/INDEX: Add new function to the INDEX. sqp_quadprog.m: Restore warning state if quadprog fails * misc/optim/@stk_optim_octavesqp/private/sqp_quadprog.m: Restore warning state if quadprog fails. Provide better tools to check for optimizer availability (ticket #64) * misc/optim/@stk_optim_baseclass: New abstract base class for all optimizer object classes. * misc/optim/@stk_optim_baseclass/stk_optim_baseclass.m: New function, constructor of the new base class. * misc/optim/@stk_optim_baseclass/isequal.m: Overload isequal Octave 3.2.x compatibility, see CODING_GUIDELINES. * misc/optim/@stk_optim_fmincon/stk_optim_fmincon.m: Derive from the new class. * misc/optim/@stk_optim_fminsearch/stk_optim_fminsearch.m: Idem. * misc/optim/@stk_optim_octavesqp/stk_optim_octavesqp.m: Itou. * misc/optim/stk_optim_isavailable.m: New function, which tests if a given optimization algorithm is available. * misc/optim/@stk_optim_baseclass/stk_optim_isavailable.m: Overload the generic function stk_optim_isavailable for the abstract base class. * misc/optim/stk_minimize_boxconstrained.m: Fix unit tests. * misc/optim/stk_minimize_unconstrained.m: Fix unit tests. * admin/octpkg/INDEX: Add new functions to the INDEX. 2017-02-07 Julien Bect Oldest supported version of Octave is now 3.2.4 * admin/build_tools/build_octpkg.m: Modify supported version from 3.2.2 to 3.2.4 in DESCRIPTION, in accordance with README.md. * NEWS: No need to advertise such a tiny change of version number. stk_init.m: Use __octave_config_info__ instead of octave_config_info * stk_init.m: Use __octave_config_info__ instead of octave_config_info, which is now deprecated. * admin/octpkg/patches/remove-buildmex.patch: Refresh patch. * admin/octpkg/patches/remove-testprivatemex.patch: Refresh patch. * admin/octpkg/patches/stk-init-rmpath-cleanup.patch: New patch. * admin/octpkg/patches/series: Insert new patch in the series. Prevent errors in Matlab <=R2014a using try-end blocks (bis) * arrays/@stk_factorialdesign/stk_factorialdesign.m: Add try-end block. * admin/octpkg/patches/matlab-graphics-axis-Axes.patch: New patch to remove Matlab related blocks from Octave package release. * admin/octpkg/patches/series: Insert new patch in the series. 2017-02-06 Julien Bect stk_dataframe.m: Prevent error in Matlab <=R2014a using a try-end block * arrays/@stk_dataframe/stk_dataframe.m: Prevent superiorto() from generating an error in Matlab <=R2014a using a try-end block. 2017-01-28 Julien Bect stk_dominatedhv_mex.c: Remove unused variable * misc/pareto/private/stk_dominatedhv_mex.c: Remove unused variable. 2017-01-27 Julien Bect stk_init: Fix install_mole_function (again) * stk_init: Fix install_mole_function (again). stk_init.m: Set use_silent to zero in Octave * stk_init.m: Set use_silent to zero in Octave. * admin/octpkg/patches/remove-buildmex.patch: Refresh patch. * admin/octpkg/patches/remove-testprivatemex.patch: Refresh patch. 2017-01-25 Julien Bect stk_init: Fix install_mole_function * stk_init: Fix install_mole_function. stk_init: Use mex without -silent when it is not supported * stk_init: Use mex without -silent when it is not supported. * admin/octpkg/patches/remove-buildmex.patch: Refresh patch. * admin/octpkg/patches/remove-testprivatemex.patch: Refresh patch. Fix minor issues in C source code * misc/distrib/private/stk_distrib_bivnorm0_cdf.c: Insert braces to avoid "Missing braces around initializer" warning. * misc/pareto/private/wfg.c: Remove unused variables. 2017-01-24 Julien Bect @stk_dataframe/subsasgn.m: Octave 3.2.x repmat hack * arrays/@stk_dataframe/subsasgn.m: Hack for a problem related to repmat in Octave 3.2.x. Do not use ismatrix. * arrays/generic/stk_boundingbox.m: Do not use ismatrix. * misc/pareto/stk_dominatedhv.m: Do not use ismatrix. * admin/CODING_GUIDELINES: Explain why. * misc/error/stk_assert_box.m: Refer to CODING_GUIDELINES. stk_example_doe04.m: Do not use ~ to ignore unwanted outputs * examples/02_design_of_experiments/stk_example_doe04.m: Do not use ~ to ignore unwanted output arguments. * admin/CODING_GUIDELINES: Explain why. stk_plot1d.m: Ignore legend errors * misc/plot/stk_plot1d.m: Ignore legend errors. 2017-01-23 Julien Bect @stk_dataframe: Deprecate info field * arrays/@stk_dataframe/stk_sprintf.m: Hide info field. * arrays/@stk_factorialdesign/stk_sprintf.m: Hide info field. * arrays/@stk_dataframe/stk_sprintf_info.m: Removed (was "internal"). * arrays/generic/stk_sprintf_info.m: Removed (was "internal"). * admin/octpkg/INDEX: Remove both functions from the index. * core/@stk_model_gpposterior/stk_predict.m: Do not set info. * sampling/stk_sampling_halton_rr2.m: Do not set info. * sampling/stk_sampling_maximinlhs.m: Do not set info. * sampling/stk_sampling_olhs.m: Do not set info. * sampling/stk_sampling_randomlhs.m: Do not set info. * sampling/stk_sampling_randunif.m: Do not set info. * sampling/stk_sampling_regulargrid.m: Do not set info. * sampling/stk_sampling_sobol.m: Do not set info. * arrays/@stk_dataframe/isequal.m: Ignore info. @stk_dataframe/subsref.m: Minor modif to make it work in Octave 3.2.4 * arrays/@stk_dataframe/subsref.m: Minor modification to make it work in Octave 3.2.4 despite a but that allows subsref to modify its input argument. stk_feval.m: Use commas in cell arrays of function handles * arrays/generic/stk_feval.m: Separate elements with commas when creating cell arrays of function handles. * admin/CODING_GUIDELINES: Explain why. 2017-01-22 Julien Bect README.md: Raise minimal Octave version to 3.2.4 * README.md: Raise minimal Octave version to 3.2.4. README.md: Rewrite C compiler requirement * README.md: Rewrite C compiler requirement stk_parallel_engine_parfor.m: Adapt to the 'new' PCT syntax * misc/parallel/@stk_parallel_engine_parfor/stk_parallel_engine_parfor.m: Adapt to the 'new' PCT syntax, since matlabpool has been removed. Implement isequal to maintain compatiblity with Octave 3.2.x. * arrays/@stk_dataframe/isequal.m: Handle any number of input arguments. * core/@stk_kreq_qr/isequal.m: Idem. * arrays/@stk_factorialdesign/isequal.m: Implement isequal to maintain compatibility with Octave 3.2.x. * core/@stk_model_gpposterior/isequal.m: Idem. * lm/@stk_lm_affine/isequal.m: Idem. * lm/@stk_lm_constant/isequal.m: Idem. * lm/@stk_lm_cubic/isequal.m: Idem. * lm/@stk_lm_matrix/isequal.m: Idem. * lm/@stk_lm_null/isequal.m: Idem. * lm/@stk_lm_quadratic/isequal.m: Idem. * misc/optim/@stk_optim_fmincon/isequal.m: Idem. * misc/optim/@stk_optim_fminsearch/isequal.m: Idem. * misc/optim/@stk_optim_octavesqp/isequal.m: Idem. * misc/parallel/@stk_parallel_engine_none/isequal.m: Idem. * misc/parallel/@stk_parallel_engine_parfor/isequal.m: Idem. * arrays/@stk_dataframe/stk_dataframe.m: Fix unit test. * admin/octpkg/INDEX: Add new functions to the INDEX. 2017-01-21 Julien Bect stk_test_class.m: Standard unit tests for all STK classes * misc/test/stk_test_class.m: New function, which performs a series of standard unit tests that all STK classes should pass. * admin/octpkg/INDEX: Add the new function to the INDEX. * arrays/@stk_dataframe/stk_dataframe.m: Add unit test. * arrays/@stk_factorialdesign/stk_factorialdesign.m: Add unit test. * arrays/@stk_hrect/stk_hrect.m: Add unit test. * core/@stk_kreq_qr/stk_kreq_qr.m: Add unit test. * core/@stk_model_gpposterior/stk_model_gpposterior.m: Add unit test. * lm/@stk_lm_affine/stk_lm_affine.m: Add unit test. * lm/@stk_lm_constant/stk_lm_constant.m: Add unit test. * lm/@stk_lm_cubic/stk_lm_cubic.m: Add unit test. * lm/@stk_lm_matrix/stk_lm_matrix.m: Add unit test. * lm/@stk_lm_null/stk_lm_null.m: Add unit test. * lm/@stk_lm_quadratic/stk_lm_quadratic.m: Add unit test. * misc/optim/@stk_optim_fmincon/stk_optim_fmincon.m: Add unit test. * misc/optim/@stk_optim_fminsearch/stk_optim_fminsearch.m: Add unit test. * misc/optim/@stk_optim_octavesqp/stk_optim_octavesqp.m: Add unit test. * misc/parallel/@stk_parallel_engine_none/stk_parallel_engine_none.m: Add unit test. * misc/parallel/@stk_parallel_engine_parfor/stk_parallel_engine_parfor.m: Add unit test. 2017-01-19 Julien Bect stk_error.m: Catch unsupported use of -completenames * misc/error/stk_error.m: Catch unsupported use of option -completenames for dbstack in Octave 3.2.4. 2017-01-18 Julien Bect @stk_dataframe/subsasgn.m:: Do not use isequalwithnans * arrays/@stk_dataframe/subsasgn.m: Do not use isequalwithnans, which is has been removed from Octave 4.2.0. Add nargin checks for stk_lm_* functions * lm/@stk_lm_affine/stk_lm_affine.m: Add nargin check and unit test. * lm/@stk_lm_constant/stk_lm_constant.m: Idem. * lm/@stk_lm_cubic/stk_lm_cubic.m: Idem. * lm/@stk_lm_matrix/stk_lm_matrix.m: Idem. * lm/@stk_lm_null/stk_lm_null.m: Idem. * lm/@stk_lm_quadratic/stk_lm_quadratic.m: Idem. * lm/stk_lm_polynomial.m: Idem. Call @stk_dataframe/get instead of using dot indexing when possible * arrays/@stk_hrect/stk_hrect.m: Call @stk_dataframe/get instead of using dot indexing. * arrays/@stk_hrect/subsasgn.m: Idem. 2017-01-15 Julien Bect Makefile: Achieve reproducible builds without --sort=name * Makefile: Achieve reproducible builds without using the option --sort=name, which is only available is very recent versions of tar, thanks to the recommendations of https://reproducible-builds.org/. 2017-01-14 Julien Bect Makefile: Trigger build if hg id as changed * Makefile: Trigger build if hg id as changed. Makefile: Check if hg clone is clean before processing * Makefile: Check if hg clone is clean before processing. Makefile: Declare .PHONY targets * Makefile: Declare .PHONY targets. Makefile: Use timestamp files instead of directories as targets * Makefile: Use timestamp files instead of directories as targets. Makefile: Add "dist" rule expected by OF admins * Makefile: Add "dist" rule to build packages only, as expected by Octave Forge admins. 2017-01-14 Julien Bect stk_init.m: Display GCC version warning only once (Matlab only) * stk_init.m (stk_init__compile): Capture GCC version warnings. (stk_init__build_mex): Display GCC version warning only once. * admin/octpkg/patches/remove-buildmex.patch: Refresh patch. * admin/octpkg/patches/remove-testprivatemex.patch: Refresh patch. 2017-01-13 Julien Bect README.md: Explain that there are two releases (closes ticket #62) * README.md: Explain that there are two releases, and the specific "quick start" procedure for each release. 2017-01-09 Julien Bect README.md: Remove warning about STK not starting if GLPK is missing * README.md: Remove useless warning about STK not starting is Octave is configured without GLPK. I only met this case once, a long time ago, with Octave 3.0 on some BD distro... 2017-01-07 Julien Bect stk_example_kb09.m: Catch a legend-related bug (closes ticket #55) * examples/01_kriging_basics/stk_example_kb09.m: Add a try/catch block to catch a legend-related bug that shows up in Octave 4.0.x. 2017-01-04 Julien Bect Provide help texts for stk_lm_* functions * lm/@stk_lm_affine/stk_lm_affine.m: Add help text. * lm/@stk_lm_constant/stk_lm_constant.m: Idem. * lm/@stk_lm_cubic/stk_lm_cubic.m: Idem. * lm/@stk_lm_matrix/stk_lm_matrix.m: Idem. * lm/@stk_lm_null/stk_lm_null.m: Idem. * lm/@stk_lm_quadratic/stk_lm_quadratic.m: Idem. * lm/stk_lm_polynomial.m: Idem. stk_dominatedhv.m: Remove dominated points before using WFG * misc/pareto/stk_dominatedhv.m: Remove dominated points before using WFG, since WFG assumes that there are no duplicated points. 2017-01-01 Julien Bect stk_generate_samplepaths.m: Improve the documentation * utils/stk_generate_samplepaths.m: Improve the documentation. In particular, warn about the case of noisy observations. stk_predict: Explain the Bayesian point of view * core/stk_predict.m: Explain the Bayesian point of view. Fix one-line help for overloaded STK functions * arrays/@stk_dataframe/stk_conditioning.m: Fix one-line help. * arrays/@stk_dataframe/stk_generate_samplepaths.m: Idem. * arrays/@stk_hrect/stk_normalize.m: Idem. * arrays/@stk_hrect/stk_rescale.m: Idem. * core/@stk_model_gpposterior/stk_isnoisy.m: Idem. * core/@stk_model_gpposterior/stk_predict.m: Idem. * core/@stk_model_gpposterior/stk_predict_leaveoneout.m: Idem. 2016-12-29 Julien Bect Polish new LOO cross-validation function * core/@stk_model_gpposterior/stk_predict_leaveoneout.m: Return residuals in a dataframe (instead of a structure). * core/stk_predict_leaveoneout.m: Add doc and unit tests. * examples/01_kriging_basics/stk_example_kb10.m: Update name of normalized residual field (second column of the new dataframe). * misc/plot/stk_plot_histnormres.m: Fix a tiny bug. Fix one-line help for overloaded feval functions in lm * lm/@stk_lm_affine/feval.m: Fix one-line help. * lm/@stk_lm_constant/feval.m: Idem. * lm/@stk_lm_cubic/feval.m: Idem. * lm/@stk_lm_matrix/feval.m: Idem. * lm/@stk_lm_null/feval.m: Idem. * lm/@stk_lm_quadratic/feval.m: Idem. 2016-12-15 Julien Bect stk_model_gpposterior.m: Estimate if param has NaNs (closes ticket #40) * core/@stk_model_gpposterior/stk_model_gpposterior.m: Estimate parameters automatically if prior_model.param contains NaNs. @stk_model_gpposterior/disp.m: Clarify display. * core/@stk_model_gpposterior/disp.m: Clarify display. @stk_model_gpposterior: Make all properties read-only. * core/@stk_model_gpposterior/set.m: Make all properties read-only. Provide meaningful hints in error messages. * core/@stk_model_gpposterior/set_prior_model.m: Removed. * core/@stk_model_gpposterior/stk_model_gpposterior.m: Set prior_model directly since set_prior_model no longer exists. * admin/octpkg/INDEX: Update index. @stk_model_gpposterior: Remove somes properties * core/@stk_model_gpposterior/get_input_dim.m: Removed. * core/@stk_model_gpposterior/get_output_dim.m: Removed. * core/@stk_model_gpposterior/get_lognoisevariance.m: Removed. * core/@stk_model_gpposterior/get_lognoisevariance.m: Removed. * core/@stk_model_gpposterior/get_param.m: Removed. * core/@stk_model_gpposterior/set_param.m: Removed. * core/@stk_model_gpposterior/fieldnames.m: Remove properties. * core/@stk_model_gpposterior/disp.m: Idem. * core/@stk_model_gpposterior/get.m: Idem. * core/@stk_model_gpposterior/set.m: Idem. * core/@stk_model_gpposterior/subsref.m: Remove one unit test. * admin/octpkg/INDEX: Update index. README.md: Use numeric references * README.md: Use numeric references instead of author-year. README.md: Move sentence about M/O compatiblity to "Quick start" * README.md: Move the sentence about Matlab/Octave compatiblity to the "Quick start" section. Remove redundant sentence about the meaning of STK. README.md: Remove sentence about parallel computing * README.md: Remove the sentence about parallel computing not being supported in Octave, since there is actually very little support, currently, for parallel computing in *both* Matlab and Octave. README.md: Remove redundant licence statement * README.md: Remove redundant licence statement. Makefile: download new icons for visual inspection of HTML doc * Makefile: download new icons (news.png, homepage.png) for visual inspection of OctaveForge HTML doc. 2016-12-14 Julien Bect Convert README to Markdown format * README: Renamed to README.md. * README.md: Renamed from README.md and converted to Markdown. Removed copyright notice. * admin/build_tools/build_allpurpose.m: Rename README -> README.md. * admin/build_tools/build_octpkg.m: Idem. * admin/build_tools/copy_readme.m: Idem. * admin/find_nonstandard_characters.sh: Process all *README* files. * admin/fix_eol.sh: Idem. 2016-12-09 Julien Bect Save M/O version info when compiling MEX-files (closes ticket #54) * stk_init.m: Save Matlab/Octave version info in a text file with the .info extension when compiling MEX-files. * .hgignore: Ignore .info files. * admin/octpkg/patches/remove-testprivatemex.patch: update patch. * admin/octpkg/patches/remove-buildmex.patch: update patch. * admin/build_tools/build_octpkg.m: Ignore *.info files. 2016-12-05 Julien Bect @stk_dataframe: Overload openvar * arrays/@stk_dataframe/openvar.m: Overload base function. * misc/options/stk_options_set.m: Add option openvar_warndlg with default value true. * INDEX: Add @stk_dataframe/openvar to the index. stk_lm_polynomial.m: Add nargin check (closes ticket #52) * lm/stk_lm_polynomial.m: Add nargin check. 2016-12-04 Julien Bect stk_optim_fmincon, stk_optim_fminsearch: improve option processing * misc/optim/@stk_optim_fmincon/stk_optim_fmincon.m: Improve option processing. * misc/optim/@stk_optim_fminsearch/stk_optim_fminsearch.m: Idem. * misc/optim/stk_minimize_boxconstrained.m: Add tests. * misc/optim/stk_minimize_unconstrained.m: Add tests. 2016-12-02 Julien Bect Do not call display on model structures (closes ticket #47) * examples/01_kriging_basics/stk_example_kb01.m: Do not call display on model structures. * examples/01_kriging_basics/stk_example_kb01n.m: Idem. * examples/01_kriging_basics/stk_example_kb02.m: Idem. * examples/01_kriging_basics/stk_example_kb02n.m: Idem. * examples/03_miscellaneous/stk_example_misc03.m: Idem: * admin/CODING_GUIDELINES: Explain why. 2016-11-12 Julien Bect New covariance functions: exponential + spherical * covfcs/rbf/stk_rbf_exponential.m: New function ("exponential" RBF) * covfcs/rbf/stk_rbf_spherical.m: New function ("spherical" RBF) * covfcs/stk_expcov_aniso.m: New covariance function. * covfcs/stk_expcov_iso.m: New covariance function. * covfcs/stk_sphcov_aniso.m: New covariance function. * covfcs/stk_sphcov_iso.m: New covariance function. * core/stk_model.m: Support new covariance functions. * paramestim/stk_param_init.m: Idem. * paramestim/stk_param_getdefaultbounds.m: Idem. * admin/octpkg/INDEX: Update index. 2016-11-11 Julien Bect Rename stk_sf_* functions to stk_rbf_* and make them public * misc/specfun/stk_sf_gausscorr.m: Moved to covfcs/rbf and renamed. * misc/specfun/stk_sf_matern.m: Moved to covfcs/rbf and renamed. * misc/specfun/stk_sf_matern32.m: Moved to covfcs/rbf and renamed. * misc/spfun/stk_sf_matern52.m: Moved to covfcs/rbf and renamed. * covfcs/rbf/stk_rbf_gauss.m: Renamed from stk_sf_gausscorr. * covfcs/rbf/stk_rbf_matern.m: Renamed from stk_sf_matern. * covfcs/rbf/stk_rbf_matern32.m: Renamed from stk_sf_matern32. * covfcs/rbf/stk_rbf_matern52.m: Renamed from stk_sf_matern52. * covfcs/rbf/stk_sf_gausscorr.m: Deprecated. * covfcs/rbf/stk_sf_matern.m: Deprecated. * covfcs/rbf/stk_sf_matern32.m: Deprecated. * covfcs/rbf/stk_sf_matern52.m: Deprecated. * covfcs/stk_gausscov_aniso.m: Use new function names. * covfcs/stk_gausscov_iso.m: Use new function names. * covfcs/stk_materncov32_aniso.m: Use new function names. * covfcs/stk_materncov32_iso.m: Use new function names. * covfcs/stk_materncov52_aniso.m: Use new function names. * covfcs/stk_materncov52_iso.m: Use new function names. * covfcs/stk_materncov_aniso.m: Use new function names. * covfcs/stk_materncov_iso.m: Use new function names. * misc/benchmarks/stk_benchmark_cov2.m: Use new function names. * misc/options/stk_options_set.m: Rename options and ensure that the old option names are still accepted (with a warning). * misc/options/stk_options_get.m: Ensure that the old option names are still accepted (with a warning). * stk_init.m: Change path. * admin/octpkg/INDEX: Update index. 2016-09-21 Julien Bect Reduce the number of allocations in WFG * misc/pareto/private/wfg.c: Reduce the number of allocations in WFG by allocating large blocks of size n * allocated_size for xmin and xmax. * misc/pareto/private/wfg.h: Add fields xmin_data and xmax_data to Rlist structures. * misc/pareto/private/stk_dominatedhv_mex.c: Change rule of thumb. 2016-09-20 Julien Bect Fix two bugs in stk_dominatedhv. * misc/pareto/private/wfg.c: Fix two bugs affecting the case where the decomposition is returned. * misc/pareto/stk_dominatedhv.m: Unit tests. 2016-07-21 Julien Bect core/stk_model_fixlm.m: Fix error message * core/stk_model_fixlm.m: Fix error message. 2016-07-21 Rémi Stroh arrays/@stk_dataframe: Overload 25 additional unitary base functions (sin, exp...) * arrays/@stk_dataframe/acos.m: New overloaded base function * arrays/@stk_dataframe/acosd.m: Idem. * arrays/@stk_dataframe/acosh.m: Idem. * arrays/@stk_dataframe/asin.m: Idem. * arrays/@stk_dataframe/asind.m: Idem. * arrays/@stk_dataframe/asinh.m: Idem. * arrays/@stk_dataframe/atan.m: Idem. * arrays/@stk_dataframe/atand.m: Idem. * arrays/@stk_dataframe/atanh.m: Idem. * arrays/@stk_dataframe/cos.m: Idem. * arrays/@stk_dataframe/cosd.m: Idem. * arrays/@stk_dataframe/cosh.m: Idem. * arrays/@stk_dataframe/exp.m: Idem. * arrays/@stk_dataframe/expm1.m: Idem. * arrays/@stk_dataframe/log.m: Idem. * arrays/@stk_dataframe/log10.m: Idem. * arrays/@stk_dataframe/log1p.m: Idem. * arrays/@stk_dataframe/log2.m: Idem. * arrays/@stk_dataframe/sin.m: Idem. * arrays/@stk_dataframe/sind.m: Idem. * arrays/@stk_dataframe/sinh.m: Idem. * arrays/@stk_dataframe/sqrt.m: Idem. * arrays/@stk_dataframe/tan.m: Idem. * arrays/@stk_dataframe/tand.m: Idem. * arrays/@stk_dataframe/tanh.m: Idem. * admin/octpkg/INDEX: Add new functions to the INDEX arrays/@stk_dataframe/logical.m: New overloaded base function * arrays/@stk_dataframe/logical.m: New overloaded base function. * admin/octpkg/INDEX: Add new function to the INDEX. arrays/@stk_dataframe/bsxfun.m: Preserve row names if possible * arrays/@stk_dataframe/bsxfun.m: Preserve row names if possible. 2016-06-23 Julien Bect Linear model objects are no more considered as an experimental feature * core/stk_model.m: Create objects with a .lm field as a default. * core/stk_model_fixlm.m: New internal function that ensures backward compatiblity for model structures with a .order field. * core/stk_ortho_func.m: Indicate deprecation of .order. Call stk_model_fixlm to ensure backward compatibility. * admin/octpkg/INDEX: Show stk_lm_* functions in the INDEX. * examples/01_kriging_basics/stk_example_kb03.m: Use model.lm field instead of model.order. * paramestim/stk_param_init.m: Use model.lm field instead of model.order. Call stk_model_fixlm to ensure backward compatibility. * examples/01_kriging_basics/stk_example_kb06.m: Idem. * examples/03_miscellaneous/stk_example_misc03.m: Idem. * core/@stk_model_gpposterior/get.m: Fix unit tests. * core/@stk_model_gpposterior/set.m: Fix unit tests. * core/@stk_model_gpposterior/stk_model_gpposterior.m: Fix unit tests. * core/@stk_model_gpposterior/stk_predict.m: Fix unit tests. * core/@stk_model_gpposterior/subsref.m: Fix unit tests. * core/stk_make_matcov.m: Fix help and unit tests. * core/stk_model_update.m: Fix unit tests. * core/stk_predict.m: Fix unit tests. * covfcs/stk_discretecov.m: Fix unit tests. * paramestim/stk_param_gls.m: Fix unit tests. * paramestim/stk_param_relik.m: Fix unit tests. 2016-06-22 Julien Bect Indicate internal and deprecated functions more systematically * admin/octpkg/INDEX: Indicate internal and deprecated functions more systematically. * arrays/@struct/double.m: Indicate deprecation (was already mentioned in the INDEX file). * arrays/@struct/stk_boundingbox.m: Idem. * arrays/@struct/stk_length.m: Idem. 2016-05-29 Julien Bect New function to get/set optimizable parameters. * paramestim/private/stk_get_optimizable_parameters.m: New function get the value of optimizable parameters. * paramestim/private/stk_set_optimizable_parameters.m: New function set the value of optimizable parameters. * paramestim/stk_param_estim.m: Use the new functions wherever it is appropriate. * paramestim/stk_param_relik.m: Idem. INDEX: Bring up to date * admin/octpkg/INDEX: Bring up to date. 2016-05-27 Julien Bect stk_benchmark_examples.m: new benchmark script * misc/benchmarks/stk_benchmark_examples.m: new benchmark script, which benchmarks all examples in the toolbox. 2016-05-26 Julien Bect stk_example_doe05.m: Plot only once in a while * examples/02_design_of_experiments/stk_example_doe05.m: Plot only once in a while (default: PLOT_PERIOD = 10). stk_example_doe05.m: Remove stopping condition based on EQI_max * examples/02_design_of_experiments/stk_example_doe05.m: Remove stopping condition based on EQI_max, which is never met anyway. 2016-05-07 Julien Bect stk_isnoisy: new function to test for a noisy model * core/stk_isnoisy.m: New function, which returns false for a noiseless model and true otherwise. This is the base implementation for (prior) model structures. * core/@stk_model_gpposterior/set_prior_model.m: New function. Overload stk_isnoisy for posterior model objects. * admin/BACKWARD_COMPATIBILITY.md: Indicate that stk_noisy is the preferred way of handling the "missing lognoisevariance" backward compatibility issue. * core/@stk_model_gpposterior/set_prior_model.m: Use stk_isnoisy. * core/stk_make_matcov.m: Idem. * core/stk_model.m: Idem. * iago/crit/stk_optim_crit_EI.m: Idem. * iago/crit/stk_optim_crit_SUR.m: Idem. * iago/crit/stk_optim_crit_iago.m: Idem. * paramestim/stk_param_estim.m: Idem. * paramestim/stk_param_init.m: Idem. * paramestim/stk_param_init_lnv.m: Idem. * paramestim/stk_param_relik.m: Idem. * sampling/@stk_sampcrit_thresholdbasedoptim/stk_sampcrit_thresholdbasedoptim.m: Idem. * utils/stk_generate_samplepaths.m: Idem. 2016-05-02 Julien Bect stk_example_doe05.m: Reduce NB_ITER. * examples/02_design_of_experiments/stk_example_doe05.m: Reduce NB_ITER to make stk_runtests run faster. stk_optim_octavesqp.m: Use a string for the 'optimizer' property * misc/optim/@stk_optim_octavesqp/stk_optim_octavesqp.m: Use a string, instead of a handle, for the 'optimizer' property. * misc/optim/@stk_optim_octavesqp/stk_minimize_boxconstrained.m: Use feval to call the optimizer, since it is no longer a handle. 2016-04-27 Julien Bect stk_sf_matern32.m, stk_sf_matern52.m: Bugfix for large h * misc/specfun/stk_sf_matern32.m: Return 0 when h is large. * misc/specfun/stk_sf_matern52.m: Idem. 2016-04-20 Julien Bect Fix a bug in stk_example_doe05 * examples/02_design_of_experiments/stk_example_doe05.m: Pass a value for tau2_new when evaluating the EQI criterion. 2016-03-15 Tom Assouline Implement EQI criterion for noisy optimization * sampling/@stk_sampcrit_eqi/stk_sampcrit_eqi.m: New function. * sampling/@stk_sampcrit_eqi/msfeval.m: New function. * examples/02_design_of_experiments/stk_example_doe05.m: Example. script 2016-03-15 Julien Bect @stk_sampcrit_modelbased/feval.m: Pass additional args to msfeval * sampling/@stk_sampcrit_modelbased/feval.m: Make it possible to pass additional arguments to msfeval. 2016-03-15 Julien Bect stk_testfun_twobumps.m: Change the sign of the test function * examples/test_functions/stk_testfun_twobumps.m: Change the sign of the test function (it looked more like "two hollows" than "two bumps"...). 2016-03-08 Julien Bect Make it possible to update heteroscedastic models * core/@stk_model_gpposterior/set_lognoisevariance.m: Provide a more informative error message when the size is wrong. Add unit tests. * core/@stk_model_gpposterior/stk_model_update.m: Handle the heteroscedastic case thanks to a new input argument. Provide informative error messages. Add unit tests. * sampling/@stk_sampcrit_modelbased/stk_model_update.m: Pass the additional input argument, unchaged. * sampling/@stk_sampcrit_thresholdbasedoptim/stk_model_update.m: Idem. 2016-03-06 Julien Bect Define and use three datasets based on TwoBumps * examples/datasets/stk_dataset_twobumps.m: New function, which defines three datasets based on TwoBumps. * examples/01_kriging_basics/stk_example_kb01.m: Use dataset 'noiseless'. Move the noisy case to stk_example_kb01n. * examples/01_kriging_basics/stk_example_kb01n.m: New example script, which corresponds to the noisy case of the previous version of stk_example_kb01. * examples/01_kriging_basics/stk_example_kb02.m: Use dataset 'noiseless'. Move the noisy case to stk_example_kb02n. * examples/01_kriging_basics/stk_example_kb02n.m: New example script, which corresponds to the noisy case of the previous version of stk_example_kb02. * examples/01_kriging_basics/stk_example_kb04.m: This example no longer exists (replaced by /stk_example_kb02n). * examples/01_kriging_basics/stk_example_kb05.m: Use dataset 'noiseless'. * examples/01_kriging_basics/stk_example_kb08.m: Idem. * examples/01_kriging_basics/stk_example_kb05.m: Use dataset 'noisy2'. * stk_init.m: Add examples/datasets to the path. * admin/octpkg/INDEX: Update index. Give a name (TwoBumps) to our oldest test function * examples/test_functions/stk_testfun_twobumps.m: Our oldest test function now as its own M-file and a name. * examples/01_kriging_basics/stk_example_kb01.m: Use the newly created stk_testfun_twobumps function. * examples/01_kriging_basics/stk_example_kb05.m: Idem. * examples/01_kriging_basics/stk_example_kb08.m: Idem. * examples/01_kriging_basics/stk_example_kb09.m: Idem. * admin/octpkg/INDEX: Add stk_testfun_twobumps. Make test functions visible in the documentation. 2016-02-29 Julien Bect Getters and setters for the @stk_model_gpposterior class * core/@stk_model_gpposterior/get_prior_model.m: New getter. * core/@stk_model_gpposterior/set_param.m: New setter. * core/@stk_model_gpposterior/set_prior_model.m: New setter, ensuring backward compatibility with partially defined prior model structures (missing dim or lognoisevariance fields). * core/@stk_model_gpposterior/set.m: Use setters when it is useful for argument checking. Prevent modification of the kreq field. * core/@stk_model_gpposterior/set_lognoisevariance.m: Add optional `recompute` input argument. * core/@stk_model_gpposterior/stk_model_gpposterior.m: Re-organize to avoid code duplication with set_prior_model. * admin/octpkg/INDEX: Update index. 2016-02-26 Julien Bect stk_kreq_qr.m: Add default constructor * core/@stk_kreq_qr/stk_kreq_qr.m: Add a default constructor, corresponding to the case where nargin == 0. 2016-02-24 Julien Bect stk_sampling_sobol.m: Cite the NLopt toolbox in the documentation * sampling/stk_sampling_sobol.m: Cite the NLopt toolbox in the documentation. 2016-02-23 Julien Bect stk_sampling_sobol.m: new function * sampling/stk_sampling_sobol.m: New function to generate points from a Sobol sequence. * sampling/private/stk_sampling_sobol_mex.c: New MEX-file. * admin/octpkg/INDEX: Add new function to the INDEX * admin/octpkg/Makefile: Add new MEX-file to the Makefile. * stk_init.m: Add new MEX-file to the build system. * admin/octpkg/patches/remove-buildmex.patch: Refresh patch. * admin/octpkg/patches/remove-testprivatemex.patch: Refresh patch. stk_param_relik.m: Introduce a 'simple_kriging' flag * paramestim/stk_param_relik.m: Introduce a 'simple_kriging' flag to clarify the meaning of the tests for q == 0. Get rid of the half-baked @stk_ndf class * iago/@stk_ndf/fieldnames.m: Deleted * iago/@stk_ndf/get.m: Deleted * iago/@stk_ndf/set.m: Deleted * iago/@stk_ndf/stk_ndf.m: Deleted * iago/@stk_ndf/stk_setnoisevariance.m: Deleted * iago/@stk_ndf/stk_sprintf.m: Deleted * iago/@stk_ndf/subsasgn.m: Deleted * iago/@stk_ndf/vertcat.m: Deleted * iago/DESIGN-NOTES.md: Remove all references to stk_ndf * iago/stk_optim.m: Idem. * iago/utils/stk_optim_addevals.m: Idem. * iago/crit/stk_optim_crit_SUR.m: Idem. * iago/crit/stk_optim_crit_iago.m: Idem. stk_sampcrit_thresholdbasedoptim.m: Add unit tests * sampling/@stk_sampcrit_thresholdbasedoptim/stk_sampcrit_thresholdbasedoptim.m: Add unit tests for various number of input arguments. 2016-02-23 Tom Assouline stk_sampcrit_thresholdbasedoptim.m: Fix nargin check * sampling/@stk_sampcrit_thresholdbasedoptim/stk_sampcrit_thresholdbasedoptim.m: Fix nargin check. 2016-02-18 Julien Bect stk_predict_leaveoneout.m: Compute residuals outside the CV loop * core/@stk_model_gpposterior/stk_predict_leaveoneout.m: Compute residuals outside the cross-validation loop. 2016-02-17 Julien Bect @stk_model_gpposterior: Make sure that lognoisevariance is a column * core/@stk_model_gpposterior/set_lognoisevariance.m: Make sure that prior_model.lognoisevariance is a column vector. * core/@stk_model_gpposterior/stk_model_gpposterior.m: Idem. 2016-02-17 Stefano Duhamel stk_predict_leaveoneout.m: Bugfix for the heteroscedastic case (bug #43) * core/@stk_model_gpposterior/stk_predict_leaveoneout.m: Delete the lognoisevariance of the left-out point in the heteroscedastic case (fixes bug #43). 2016-02-16 Stefano Duhamel stk_predict_leaveoneout.m: Add a (currently failing) unit test * core/stk_predict_leaveoneout.m: Add a (currently failing) unit test. 2016-02-16 Julien Bect Get rid of iago/utils/get_lognoisevariance.m * iago/utils/get_lognoisevariance.m: Deleted. * iago/crit/stk_optim_crit_SUR.m: Do without it. * iago/crit/stk_optim_crit_iago.m: Idem. Get rid of noise_params_consistency * iago/utils/noise_params_consistency.m: Deleted. * iago/crit/stk_optim_crit_EI.m: Remove call to noise_params_consistency. * iago/crit/stk_optim_crit_SUR.m: Idem. * iago/crit/stk_optim_crit_iago.m: Idem. * iago/utils/stk_optim_addevals.m: Idem. Improve @stk_sampcrit_thresholdbasedoptim class * sampling/@stk_sampcrit_thresholdbasedoptim/stk_sampcrit_thresholdbasedoptim.m: Add properties threshold_quantile_order (public) and theshold_quantile_value (private). Streamline input arguments processing. * sampling/@stk_sampcrit_thresholdbasedoptim/get_threshold_quantile_order.m: Fast getter for new public property. * sampling/@stk_sampcrit_thresholdbasedoptim/set_threshold_quantile_order.m: Fast setter for new public property. * sampling/@stk_sampcrit_thresholdbasedoptim/get_threshold_mode.m: Rename output argument. * sampling/@stk_sampcrit_thresholdbasedoptim/get_threshold_value.m: Rename output argument. * sampling/@stk_sampcrit_thresholdbasedoptim/set_threshold_mode.m: Fix bug. Accept mixed-case variants of mode string. * sampling/@stk_sampcrit_thresholdbasedoptim/set_threshold_value.m: Fix bug. Implement quantile case. * sampling/@stk_sampcrit_thresholdbasedoptim/disp.m: Display new public property. Change display layout. * sampling/@stk_sampcrit_thresholdbasedoptim/get.m: Use direct access to properties whenever possible. * sampling/@stk_sampcrit_thresholdbasedoptim/set.m: Add new public property. 2016-02-15 Julien Bect stk_param_relik.m: Add comments * paramestim/stk_param_relik.m: Add comments. First draft of a class hierarchy for sampling criteria * sampling/@stk_sampcrit_base: New class * sampling/@stk_sampcrit_base/disp.m: New function * sampling/@stk_sampcrit_base/display.m: New function * sampling/@stk_sampcrit_base/horzcat.m: New function * sampling/@stk_sampcrit_base/stk_sampcrit_base.m: New function * sampling/@stk_sampcrit_base/subsasgn.m: New function * sampling/@stk_sampcrit_base/subsref.m: New function * sampling/@stk_sampcrit_base/vertcat.m: New function * sampling/@stk_sampcrit_modelbased: New class * sampling/@stk_sampcrit_modelbased/feval.m: New function * sampling/@stk_sampcrit_modelbased/get_input_data.m: New function * sampling/@stk_sampcrit_modelbased/get_model.m: New function * sampling/@stk_sampcrit_modelbased/get_output_data.m: New function * sampling/@stk_sampcrit_modelbased/set_model.m: New function * sampling/@stk_sampcrit_modelbased/stk_model_update.m: New function * sampling/@stk_sampcrit_modelbased/stk_sampcrit_modelbased.m: New function * sampling/@stk_sampcrit_singleobjoptim: New class * sampling/@stk_sampcrit_singleobjoptim/get_bminimize.m: New function * sampling/@stk_sampcrit_singleobjoptim/get_goal.m: New function * sampling/@stk_sampcrit_singleobjoptim/set_goal.m: New function * sampling/@stk_sampcrit_singleobjoptim/stk_sampcrit_singleobjoptim.m: New function * sampling/@stk_sampcrit_thresholdbasedoptim: New class * sampling/@stk_sampcrit_thresholdbasedoptim/disp.m: New function * sampling/@stk_sampcrit_thresholdbasedoptim/get.m: New function * sampling/@stk_sampcrit_thresholdbasedoptim/get_threshold_mode.m: New function * sampling/@stk_sampcrit_thresholdbasedoptim/get_threshold_value.m: New function * sampling/@stk_sampcrit_thresholdbasedoptim/set.m: New function * sampling/@stk_sampcrit_thresholdbasedoptim/set_goal.m: New function * sampling/@stk_sampcrit_thresholdbasedoptim/set_model.m: New function * sampling/@stk_sampcrit_thresholdbasedoptim/set_threshold_mode.m: New function * sampling/@stk_sampcrit_thresholdbasedoptim/set_threshold_value.m: New function * sampling/@stk_sampcrit_thresholdbasedoptim/stk_model_update.m: New function * sampling/@stk_sampcrit_thresholdbasedoptim/stk_sampcrit_thresholdbasedoptim.m: New function * sampling/@stk_sampcrit_ei: New class * sampling/@stk_sampcrit_ei/msfeval.m: New function * sampling/@stk_sampcrit_ei/stk_sampcrit_ei.m: New function * sampling/stk_sampcrit_ehvi_eval.m: New function * sampling/stk_sampcrit_ei_eval.m: New function * sampling/stk_sampcrit_emmi_eval.m: New function * examples/02_design_of_experiments/stk_example_doe03.m: Use a sampling criterion object 2016-02-11 Julien Bect stk_lm_polynomial.m: Create polynomial LM object * lm/stk_lm_polynomial.m: New function. * core/stk_ortho_func.m: Use stk_lm_polynomial. * paramestim/stk_param_init.m: Use stk_lm_polynomial. * admin/octpkg/INDEX: Add new function to the index. 2016-02-10 Julien Bect stk_make_matcov.m: Error message for NaN in covariance parameters * core/stk_make_matcov.m: Issue an error message if covariance parameters have not been estimated. stk_error.m: Use complete names in the stack * misc/error/stk_error.m: Use complete names in the stack, to obtain better-looking error messages in Matlab. 2016-02-04 Julien Bect Provide generic stk_minimize_* functions * misc/optim/stk_minimize_boxconstrained.m: Generic stk_minimize_boxconstrained function, which accepts a char array as first input argument, and provides a generic documentation for all stk_minimize_boxconstrained methods. * misc/optim/stk_minimize_unconstrained.m: Same thing for stk_minimize_unconstrained methods. * admin/octpkg/INDEX: Add new functions to the index. Workaround for Octave bug #46350 (closes ticket #32) * admin/octpkg/patches/workaround-octave-bug-46350.patch: New patch that comments some unit tests out. * admin/octpkg/patches/series: Add new patch to the series. stk_optimscript.m: Fix %!shared blocks * iago/stk_optimscript.m: Fix %!shared blocks. 2016-02-02 Julien Bect Add some basic support for LOO cross-validation * core/@stk_model_gpposterior/stk_predict_leaveoneout.m: New function that computes LOO predictions and residuals. Currently implemented in a very basic manner (virtual-LOO formulas will be implemented later). * core/stk_predict_leaveoneout.m: Just a wrapper around the first one (very inefficient as it is, since we create a "posterior" that we don't really use... but we should). * misc/plot/stk_plot_predvsobs.m: New graphical function, to visualize predictions versus observations. * misc/plot/stk_plot_histnormres.m: New graphical function, to the distribution of normalized residuals. * examples/01_kriging_basics/stk_example_kb10.m: Example script. * stk_example_kb10.m: Add new functions to the index. stk_testfun_borehole.m: New test function * examples/test_functions/stk_testfun_borehole.m: New test function (the "borehole model" response function, from Harper & Gupta 1983). * admin/octpkg/INDEX: Add new function to the index (hidden for now, as the other stk_testfun_* functions, bug perhaps should we change that ?). @stk_model_gpposterior/disp.m: Fix a bug and improve layout * core/@stk_model_gpposterior/disp.m: Fix a bug and (try to) improve visual layout. 2016-01-28 Julien Bect Rename the output argument in optimizer objects * misc/optim/@stk_optim_fmincon/stk_optim_fmincon.m: Rename the output argument (optimizer object) to 'algo'. * misc/optim/@stk_optim_fminsearch/stk_optim_fminsearch.m: Idem. * misc/optim/@stk_optim_octavesqp/stk_optim_octavesqp.m: Idem. 2016-01-27 Julien Bect Overhaul plotting functions * misc/plot/stk_get_axis_arg.m: Rename to stk_plot_getaxisarg * misc/plot/stk_plot_getaxisarg.m: Renamed from stk_plot_getaxisarg, with some minor modifications along the way. * admin/octpkg/INDEX: Update index following function rename. * arrays/@stk_dataframe/plot.m: Rewrite to make use of stk_plot_getaxisarg. Rename variable h to h_plot. * arrays/@stk_factorialdesign/private/plot_surfmeshcontour.m: Rewrite to make use of stk_plot_getaxisarg. Rename variable h_axis to h_axes. * arrays/@stk_hrect/axis.m: Rename variable h to h_axes. * misc/plot/stk_figure.m: Rename variable h to h_fig. * misc/plot/stk_labels.m: Add option axes handle input argument, based on stk_plot_getaxisarg. Return vector of handles to label objects. * misc/plot/stk_plot1d.m: Rewrite to make use of stk_plot_getaxisarg. Rename variable h to h_plot. * misc/plot/stk_plot_shadedci.m: Rewrite to make use of stk_plot_getaxisarg. Rename variable h to h_plot. * misc/plot/stk_subplot.m: Rename variable h to h_axes. * misc/plot/stk_xlabel.m: Simplify source code by removing the possibility of having a vector of axes handles (why did I ever do that ?). Fix the confusion between axes handle and label handle. Rename output handle h to h_label. * misc/plot/stk_ylabel.m: Idem. * misc/plot/stk_zlabel.m: Idem. @stk_factorialdesign: Return handles from all plot functions * arrays/@stk_factorialdesign/surf.m: Return a handle. * arrays/@stk_factorialdesign/contour.m: Return a handle. * arrays/@stk_factorialdesign/mesh.m: Return a handle. * arrays/@stk_factorialdesign/meshc.m: Return a handle. * arrays/@stk_factorialdesign/meshz.m: Return a handle. * arrays/@stk_factorialdesign/pcolor.m: Return a handle. * arrays/@stk_factorialdesign/private/plot_surfmeshcontour.m: Return a handle to the plot object just constructed. Also, fix some bugs related to the optional axis handle argument. 2016-01-25 Julien Bect stk_plot1d: Accept a handle as optional first argument * misc/plot/stk_plot1d.m: Accept a handle as optional first argument. Remove stk_plot2d (had been deprecated for a while) * misc/plot/stk_plot2d.m: Removed (deprecated since 2.2.0) * admin/octpkg/INDEX: Remove stk_plot2d from the index * arrays/@stk_factorialdesign/private/plot_surfmeshcontour.m: Rearrange copyright information. 2016-01-22 Julien Bect @stk_model_gpposterior: Preserve row and column names * core/@stk_model_gpposterior/stk_model_gpposterior.m: Preserver row and column names in input/output data. * core/@stk_model_gpposterior/stk_model_update.m: Idem. * core/@stk_model_gpposterior/stk_predict.m: Use double() to extract the numerical content of the 'output_data' field. stk_optim_init.m: Fix the value of algo.model.dim * iago/utils/stk_optim_init.m: Fix the value of algo.model.dim. More work on stk_model_gpposterior properties * core/@stk_model_gpposterior/get_input_data.m: Rename variable. * core/@stk_model_gpposterior/get_output_data.m: Rename variable. * core/@stk_model_gpposterior/fieldnames.m: New function. * core/@stk_model_gpposterior/set.m: New function. * core/@stk_model_gpposterior/subsasgn.m: New function. * core/@stk_model_gpposterior/set_lognoisevariance.m: New function. * core/@stk_model_gpposterior/stk_model_gpposterior.m: Accept prior model structure with missing 'dim' field. Properties input_dim/output_dim for stk_model_gpposterior objects * core/@stk_model_gpposterior/get.m: Add new properties 'input_dim', 'output_dim'. Make 'dim' an alias for 'input_dim'. * core/@stk_model_gpposterior/get_dim.m: Rename to get_input_dim.m. * core/@stk_model_gpposterior/get_input_dim.m: Renamed from get_dim.m. * core/@stk_model_gpposterior/get_output_dim.m: New function that returns the output dimension, currently always one. * core/@stk_model_gpposterior/disp.m: Display the new properties. Improve the overall display. * core/@stk_model_gpposterior/stk_model_gpposterior.m: Remove field 'dim'. * core/@stk_model_gpposterior/stk_predict.m: Read .dim directly from the prior model structure. 2016-01-18 Julien Bect New functions to update models with new observations * core/@stk_model_gpposterior/stk_model_update.m: New function. * core/stk_model_update.m: New function. * admin/octpkg/INDEX: Add new functions to the index. 2016-01-16 Julien Bect Speed stk_init. * stk_init.m: Speed up by reducing the number of calls to addpath. * misc/benchmarks/stk_benchmark_init.m: New benchmark script 2015-12-15 Julien Bect stk_maxabscorr.m: Rewrite without using corr * misc/design/stk_maxabscorr.m: Rewrite without using corr. * stk_init.m (stk_init__config_mole): Remove corr * misc/mole/corr/corr.m: Deleted 2015-12-09 Julien Bect wfg.c: Fix a bug in Rlist_extend * misc/pareto/private/wfg.c (Rlist_extend): Fix a bug * misc/pareto/stk_dominatedhv.m: Add unit tests 2015-12-08 Julien Bect wfg.c: Fix a bug in Rlist_inclhv4 * misc/pareto/private/wfg.c (Rlist_inclhv4): Fix a bug * misc/pareto/stk_dominatedhv.m: Add unit tests 2015-12-03 Julien Bect Display a legend in several "kriging basics" examples * examples/01_kriging_basics/stk_example_kb01.m: Show legend * examples/01_kriging_basics/stk_example_kb02.m: Show legend * examples/01_kriging_basics/stk_example_kb04.m: Show legend * examples/01_kriging_basics/stk_example_kb09.m: Show legend @stk_model_gpposterior: A new class to represent posterior distributions * core/@stk_model_gpposterior/stk_model_gpposterior.m: Class constructor. * core/stk_predict.m: Transfer a large part of the predicition code to the method @stk_model_gpposterior/predict.m. * core/@stk_model_gpposterior/stk_predict.m: Overload stk_predict. * core/@stk_model_gpposterior/disp.m: Overload base function * core/@stk_model_gpposterior/display.m: Overload base function * core/@stk_model_gpposterior/get.m: Overload base function * core/@stk_model_gpposterior/subsref.m: Overload base function * core/@stk_model_gpposterior/vertcat.m: Overload base function * core/@stk_model_gpposterior/horzcat.m: Overload base function * core/@stk_model_gpposterior/get_dim.m: Fast getter * core/@stk_model_gpposterior/get_input_data.m: Fast getter * core/@stk_model_gpposterior/get_lognoisevariance.m: Fast getter * core/@stk_model_gpposterior/get_output_data.m: Fast getter * core/@stk_model_gpposterior/get_param.m: Fast getter 2015-11-29 Julien Bect stk_isequal_tolrel.m: Bugfix and unit test. * misc/test/stk_isequal_tolrel.m: Bugfix and unit test. 2015-11-27 Julien Bect @stk_dataframe/stk_sprintf.m: Fix header * arrays/@stk_dataframe/stk_sprintf.m: Fix header. 2015-11-25 Julien Bect Improve display of size+type information * arrays/generic/stk_sprintf_sizetype.m: Accept objects. * arrays/@cell/stk_sprintf_sizetype.m: Removed. Add minimalist display for stk_kreq objects * core/@stk_kreq_qr/disp.m: Overload base function. * core/@stk_kreq_qr/display.m: Overload base function. 2015-11-22 Julien Bect stk_predict.m: Stop accepting row input vectors in the discrete case * core/stk_predict.m: Stop accepting row input vectors in the case of discrete models (stk_discretecov covariance function). 2015-11-20 Julien Bect arrays/@stk_dataframe: Accept char and cell indices * arrays/@stk_dataframe/subsasgn.m: Accept char and cell indices. * arrays/@stk_dataframe/subsref.m: Accept char and cell indices. * arrays/@stk_dataframe/private/process_cell_indices.m: Process cell indices (cell arrays of row/column names). * arrays/@stk_dataframe/private/process_char_indices.m: Process char indices (row/column name). * arrays/@stk_dataframe/private/names_errmsg.m: Error messages for incorrect cell indices. 2015-11-19 Julien Bect Compatibility with Matlab >= R2014b: graphics handles are objects * arrays/@stk_dataframe/stk_dataframe.m: Enforce precedence over the matlab.graphics.axis.Axes class. * arrays/@stk_factorialdesign/stk_factorialdesign.m: Enforce precedence over the matlab.graphics.axis.Axes class. * arrays/@stk_dataframe/plot.m: Do not assume that graphics handles are doubles. * misc/plot/stk_plot_shadedci.m: Do not assume that graphics handles are doubles. stk_optim_fminsearch.m: Do not try to detect fminsearch * misc/optim/@stk_optim_fminsearch/stk_optim_fminsearch.m: Do not try to detect at this point whether fminsearch is available. 2015-11-15 Julien Bect stk_init.m: Remove STK's root from the path if needed * stk_init.m (stk_init__pkg_unload): Remove STK's root from the path if needed. (stk_init__rmpath): Remove verbose comment. * admin/octpkg/patches/prevent-PKG_DEL-loop.patch: New patch. * admin/octpkg/patches/series: Add new patch to the series. * admin/octpkg/patches/remove-buildmex.patch: Refresh patch. * admin/octpkg/patches/remove-testprivatemex.patch: Refresh patch. stk_init.m: No need to remove other copies of STK from the path * stk_init.m (stk_init__rmpath): No need to remove other copies of STK from the search path. Even if several copies are on the path, only the most recently installed is visible. * admin/octpkg/patches/remove-buildmex.patch: Refresh patch. * admin/octpkg/patches/remove-testprivatemex.patch: Refresh patch. Merge config/* functions into stk_init * config/stk_config_addpath.m: Replaced by stk_init__addpath. * config/stk_config_buildmex.m: Replaced by stk_init__build_mex. * config/stk_config_clearpersistents.m: Replaced by stk_init__clear_persistents. * config/stk_config_getroot.m: Removed. * config/stk_config_makeinfo.m: Replaced by stk_init__get_make_info. * config/stk_config_mole.m: Replaced by stk_init__config_mole. * config/stk_config_path.m: Replaced by stk_init__genpath. * config/stk_config_rmpath.m: Replaced by stk_init__rmpath. * config/stk_config_setup.m: Merged into stk_init__pk_load. * config/stk_config_testprivatemex.m: Replaced by stk_init__test_private_mex. * stk_runtests.m: Use stk_init genpath. * stk_init.m: Integrate config/* functions as subfunctions and introduce a public interface that makes it easy to call them separately if needed. * admin/octpkg/post_install.m: Use stk_init prune_mole. * admin/build.m: Edit comment. * admin/build_tools/build_octpkg.m: Use stk_init get_make_info. * admin/build_tools/get_public_mfile_list.m: Use stk_init genpath. * admin/octpkg/patches/prevent-PKG_ADD-loop.patch: Refresh patch. * admin/octpkg/patches/remove-buildmex.patch: Refresh patch. * admin/octpkg/patches/remove-testprivatemex.patch: Refresh patch. * admin/octpkg/patches/use-native-test-function.patch: Refresh patch. 2015-11-14 Julien Bect build_octpkg.m: Forced pop of quilt patches if an error occurs * admin/build_tools/build_octpkg.m: Forced pop of quilt patches if an error occurs. 2015-11-13 Julien Bect stk_config_path.m: Do not include STK's root in the list * config/stk_config_path.m: Do not include STK's root in the list. * config/stk_config_addpath.m: Rephrase one-line help text. * stk_init.m: Add STK's root to the path. * admin/octpkg/patches/remove-testprivatemex.patch: Refresh patch. * admin/octpkg/patches/prevent-PKG_ADD-loop.patch: Modify patch. * admin/octpkg/patches/remove-buildmex.patch: Refresh patch. 2015-11-12 Julien Bect stk_example_kb09.m: Show legend * examples/01_kriging_basics/stk_example_kb09.m: Show legend. stk_plot1d.m: Do not create a legend for conditional simulations * misc/plot/stk_plot1d.m: Prevent the automatic creation of a legend when the array of conditional simulations has column names, since stk_plot1d already creates a global legend for all of its graphical elements (the two are not compatible). Include stk_runtests in the Octave package release * admin/build_tools/build_octpkg.m: Do not ignore stk_runtests and stk_tests when processing directories. * admin/octpkg/INDEX: Add stk_runtests to the INDEX. * admin/octpkg/patches/use-native-test-function.patch: Remove stk_tests, and skrink stk_runtests to a simple wrapper around __run_test_suite__. * admin/octpkg/patches/series: Add new patch. 2015-11-11 Julien Bect sqp_quadprog.m: Bypass unit test if quadprog is not available * misc/optim/@stk_optim_octavesqp/private/sqp_quadprog.m: Bypass unit test if quadprog is not available. Use quilt patches instead of the STK_OCTAVE_PACKAGE variable * .hgignore: Ignore quilt's .pc directory * admin/build_tools/build_octpkg.m: Add .pc to the list of ignored directories. Add a quilt push/pop pair around process_directory. Remove STK_OCTAVE_PACKAGE stuff. * admin/build_tools/get_public_mfile_list.m: Add root the list returned by stk_config_path. * config/stk_config_path.m: Remove STK_OCTAVE_PACKAGE stuff. * stk_init.m: Remove STK_OCTAVE_PACKAGE stuff. * admin/octpkg/patches/prevent-PKG_ADD-loop.patch: Patch for stk_config_path to avoid PKG_ADD loop. * admin/octpkg/patches/remove-buildmex.patch: Patch that removes MEX-file building from stk_init (a Makefile is used instead in the Octave package release). Removes stk_config_buildmex and stk_config_makeinfo as well. * admin/octpkg/patches/remove-testprivatemex.patch: Patch that removes all the code related to testing if MEX-file in private directories are detected (since MEX-files are no longer in private directories in the Octave package release). * admin/octpkg/patches/series: Ordered list of patches. check_index_file.m: Fix a bug (column cell-arrays) * admin/build_tools/check_index_file.m (parse_index_file): Make sure that 'ignored' and 'indexed' are formatted as *column* cell-arrays; otherwise, check_index_file fails on vertcat operations. 2015-11-10 Julien Bect Hide experimental IAGO implementation in the INDEX * admin/octpkg/INDEX: hide experimental IAGO implementation Ignore IAGO design notes when building Octave package * iago/NOTES.temp: Renamed to DESIGN-NOTES.md * iago/DESIGN-NOTES.md: Renamed from NOTES.temp and converted to md * admin/build_tools/build_octpkg.m: Ignore DESIGN-NOTES.md 2015-11-06 Julien Bect Makefile: Fix 'clean' target (tab instead of spaces) * admin/octpkg/Makefile: Fix 'clean' target (tabs instead of spaces) 2015-10-30 Julien Bect Decrease unit test verbosity * arrays/@stk_dataframe/double.m: decrease unit test verbosity. * arrays/@stk_dataframe/sort.m: idem * arrays/@stk_dataframe/subsasgn.m: idem * arrays/@stk_factorialdesign/fieldnames.m: idem * arrays/@stk_factorialdesign/stk_factorialdesign.m: idem * arrays/@stk_hrect/horzcat.m: idem * misc/text/stk_sprintf_colvect_scientific.m: idem * paramestim/stk_param_gls.m: idem Add a 'clean' target to the Octave package Makefile * admin/octpkg/Makefile: Add a 'clean target'. 2015-10-22 Julien Bect @stk_hrect/subsref.m: Return an stk_hrect object if possible * arrays/@stk_hrect/subsref.m: Make sure that the returned value is still an stk_hrect object when the number of rows (which is two) is unchanged. @stk_hrect/ismember.m: Optimize for speed * arrays/@stk_hrect/ismember.m: Optimize for speed @stk_hrect/ismember.m: Fix two bugs * arrays/@stk_hrect/ismember.m: Fix a bug that prevented ismember from working on more than one point at a time, and another bug in the case where B is not an stk_hrect object (it was incorrectly assumed to be an stk_dataframe in this case). 2015-10-11 Julien Bect mole/matlab/file_in_path.m: Fix two bugs * misc/mole/matlab/file_in_path.m: Fix two bugs. 2015-10-10 Julien Bect stk_example_doe03.m: Use the appropriate flag for maximization * examples/02_design_of_experiments/stk_example_doe03.m: Use the appropriate flag for maximization. Also, use stk_plot1d for the upper panel plot to display pointwise credible intervals. 2015-09-30 Julien Bect Bring Octave's sqp inside STK. * misc/optim/@stk_optim_octavesqp/private/sqp_quadprog.m: New function based on Octave's sqp function, with minor modifications to be usable under Matlab with quadprog instead of qp. * misc/optim/@stk_optim_octavesqp/stk_optim_octavesqp.m: Complete rewrite. A 'qp_solver' option is added for the choice between 'qp', which is Octave's core qp solver, and 'quadprog', which is available from Mathworks' Optimization toolbox or from MOSEK. * misc/optim/@stk_optim_octavesqp/stk_minimize_boxconstrained.m: Make it possible to use either Octave's sqp or our sqp_quadprog (a handle to the function to be used is stored in algo.sqp). * misc/optim/@stk_optim_fmincon/stk_optim_fmincon.m: Do not try to check if fmincon is present or not (this can be done using stk_optim_testmin_box). * misc/optim/stk_optim_testmin_box.m: Simple test to check that a given box-constrained optimizer actually works. * misc/optim/stk_optim_testmin_unc.m: Simple test to check that a given unconstrained optimizer actually works. * misc/optim/stk_optim_hasfmincon.m: Deprecated function.. * misc/optim/stk_select_optimizer.m: Deprecated function. * misc/options/stk_options_set.m: Rewrite optimizer selection logic. Shorten some option names. * paramestim/stk_param_estim.m: Use shortened option names. * INDEX: Add new functions and classes. * misc/optim/@stk_optim_octavesqp/private/sqp_quadprog_testf.m: Used in sqp_quadprog unit tests. * misc/optim/@stk_optim_octavesqp/private/sqp_quadprog_testg.m: Used in sqp_quadprog unit tests. 2015-09-25 Julien Bect stk_param_getdefaultbounds: Documentation needed * paramestim/stk_param_getdefaultbounds.m: This function is not marked as "STK internal" any more, since this is obviously the right place to document how default bounds can be specified for user-defined functions. Documentation needed. stk_plot1d.m: Create a hidden legend and return a struct of handles * misc/plot/stk_plot1d.m: Create a hidden legend, wich can be displayed using lgend ('show'), and return a struct of handles to make it possible to modify the plot more easily. Don't use UTF-8 in m-files * misc/design/stk_phipcrit.m: Müller -> Muller * misc/dist/stk_filldist.m: Idem * misc/dist/stk_filldist_exact.m: Idem 2015-09-25 Rémi Stroh stk_param_getdefaultbounds: new feature to define default bounds * paramestim/stk_param_getdefaultbounds.m: make it possible to define default bounds on parameters for user-defined covariance functions. 2015-09-21 Julien Bect stk_plot_shadedci.m: Do not call set (h, opt{:}) when opt is empty * misc/plot/stk_plot_shadedci.m: Do not call set (h, opt{:}) when opt is empty (it makes Octave display all the settings of the object with handle h, which was not intended). 2015-09-20 Julien Bect stk_plot_shadedci.m: Accept a handle as first input argument. * misc/plot/stk_plot_shadedci.m: Accept a handle to an axes object as (optional) first input argument and accepts additional key-value pairs as well. stk_plot1d.m: Fill in DisplayName properties * misc/plot/stk_plot1d.m: Fill in the DisplayName properties for all the components of the plot, thus making it possible to create a legend automatically using: legend ('show'). 2015-09-19 Julien Bect @stk_dataframe/plot.m: Return vector of handles * arrays/@stk_dataframe/plot.m: Return vector of handles stk_plot_shadedci.m: Delete invisible area object, return a handle * misc/plot/stk_plot_shadedci.m: Delete invisible area object and return a handle to the visible one. 2015-09-15 Julien Bect README: Fix a typo * README: Fix a typo 2015-09-13 Julien Bect stk_param_init.m: Improve error message * paramestim/stk_param_init.m: Improve error message for unsupported covariance functions by reporting the original error message. 2015-08-14 Julien Bect stk_dominatedhv.m: Tolerate points that do not dominate the ref * misc/pareto/stk_dominatedhv.m: Tolerate points that do not dominate the reference point. 2015-08-13 Julien Bect stk_dominatedhv can now return a decomposition in hyper-rectangles * misc/pareto/private/wfg.c (Rlist_hv, Rlist_hv2, Rlist_inclhv) (Rlist_inclhv2, Rlist_inclhv3, Rlist_inclhv4, Rlist_exclhv) (wfg_compute_decomposition): For each original WFG function that returns an hypervolume valume, provide a function that return the corresponding decomposition as a collection of signed overlapping hyper-rectangles (RLIST structure). (Rlist_alloc, Rlist_extend, Rlist_free): Memory management for RLIST structures. * misc/pareto/private/wfg.h: Define RLIST structure and declare some associated functions. * misc/pareto/private/stk_dominatedhv_mex.c (compute_hv): Use size_t instead of int for unsigned indices. (compute_decomposition): New function, similar to compute_hv, but return the decomposition instead of the hypervolume value. (mexFunction): Use size_t instead of int for unsigned indices. Add second input argument to select between computing the hypervolume value and computing the decomposition. * misc/pareto/stk_dominatedhv.m: Add optional input argument to select whether the decomposition into overlapping hyper-rectangles must be returned (instead of the hypervolume only). Add unit tests. stk_mex.h: Define bool type * misc/include/stk_mex.h: Define bool type. 2015-08-05 Julien Bect wfg.c (hv): Code simplification * misc/pareto/private/wfg.c (hv): Factorize some code for the cases n == 3 and n >= 4. wfg.c (inclhv4): Put all declarations at the beginning * misc/pareto/private/wfg.c (inclhv4): Put all variable declarations at the beginning of the function (strict ANSI C). 2015-07-20 Julien Bect Use size_t for computations on positive indices * misc/dist/private/stk_dist_matrixx.c: Use size_t for computations on positive indices, otherwise we can get very unpleasant surprises (aka segfaults) as a consequence of negative indices... * misc/dist/private/stk_dist_matrixy.c: idem * misc/dist/private/stk_dist_pairwise.c: idem * misc/dist/private/stk_filldist_discr_mex.c: idem * misc/dist/private/stk_gpquadform_matrixx.c: idem * misc/dist/private/stk_gpquadform_matrixy.c: idem * misc/dist/private/stk_gpquadform_pairwise.c: idem * misc/dist/private/stk_mindist_mex.c: idem 2015-07-10 Julien Bect Introduce optimizer objects. * misc/optim/@stk_optim_fmincon/stk_optim_fmincon.m: Constructor for fmincon algorithm objects. * misc/optim/@stk_optim_fminsearch/stk_optim_fminsearch.m: Constructor for fminsearch algorithm objects. * misc/optim/@stk_optim_octavesqp/stk_optim_octavesqp.m: Constructor for Octave SQP algorithm objects. * misc/optim/@stk_optim_fmincon/stk_minimize_boxconstrained.m: Box-constrained optimization with fmincon. * misc/optim/@stk_optim_octavesqp/stk_minimize_boxconstrained.m: Box-constrained optimization with sqp. * misc/optim/@stk_optim_octavesqp/stk_minimize_unconstrained.m: Unconstrained optimization with sqp. * misc/optim/@stk_optim_fminsearch/stk_minimize_unconstrained.m: Unconstrained optimization with fminsearch. * paramestim/stk_param_estim.m: Big cleanup thanks to the new system of algorithm classes. * misc/options/stk_options_set.m: Select default optimization algorithms. This was previously done in stk_select_optimizer. Also, remove the option 'optim_display_level' for stk_param_estim. * config/stk_config_setup.m: Remove call to stk_select_optimizer. * misc/optim/stk_select_optimizer.m: Deprecated. * misc/optim/stk_optim_hasfmincon.m: Deprecated. * config/stk_config_clearpersistents.m: Remove stk_optim_hasfmincon and stk_select_optimizer from the list of functions to be cleared. Add stk_optim_fmincon. * admin/octpkg/INDEX: Remove stk_select_optimizer from the index. 2015-06-30 Julien Bect build_octpkg.m: Fix the generated DESCRIPTION file * admin/build_tools/build_octpkg.m: Add "Depends: octave (>= 3.2.2)" and "Autoload: no" to the generated DESCRIPTION file. 2015-06-25 Emmanuel Vazquez @stk_kreq_qr/get.m: Fix a call to dot () * core/@stk_kreq_qr/get.m: Fix a call to dot () to make it work when there is only one observation. 2015-06-25 Rémi Stroh stk_param_estim.m: Fix a bug related to parameter objects. * paramestim/stk_param_estim.m (provide_param0_value): Fix a bug related to parameter objects. More precisely, use (:) indexing systematically to access the vector of numerical parameters corresponding to a given parameter object. @stk_factorialdesign/stk_normalize.m: Add missing line continuation mark * arrays/@stk_factorialdesign/stk_normalize.m: Add missing line continuation mark. 2015-06-25 Julien Bect stk_param_init.m: XXXX_param_init (undocumented feature) * paramestim/stk_param_init.m: make it possible to define a XXXX_param_init function that provides initial estimates for a user-defined covariance function called XXXX (undocumented feature). 2015-06-24 Julien Bect stk_param_init.m: Removed unused variable. * paramestim/stk_param_init.m: Removed unused variable. stk_param_getdefaultbounds.m: Return [] for parameter classes * paramestim/stk_param_getdefaultbounds.m: Return empty lower and upper bounds for parameter classes that do not implement the stk_param_getdefaultbounds. 2015-06-17 Julien Bect wfg: Remove n from the global scope * misc/pareto/private/wfg.c:: Remove n from the global scope. Add new helper functions to encapsulate basic operations on fronts: wfg_front_init, wfg_front_destroy, wfg_front_resize. * misc/pareto/private/wfg.h: Declare the new functions. * misc/pareto/private/stk_dominatedhv_mex.c: Use the new functions. wfg.c: Pass pointers to FRONT structures * misc/pareto/private/wfg.c: Pass pointers to FRONT structures. 2015-06-16 Julien Bect check_index_file.m: Fix error handling. * admin/build_tools/check_index_file.m: Fix error handling. Use PKG_ADD/PKG_DEL directives in the Octave package. * stk_init.m: Add PKG_ADD/PKG_DEL directives. Also, add an optional input argument 'do_quit'; when it is true, stk_init removes STK from the path. * admin/build_tools/build_octpkg.m: No more PKG_ADD/PKG_DEL files. They are replaced by corresponding directives in stk_init.m, which is no longer renamed to PKG_ADD. Also, there are now two STK_OCTAVE_PACKAGE variables to set (one in stk_init.m, the other one in stk_config_rmpath.m). * admin/build_tools/check_index_file.m: No need to warry about PKG_ADD.m ad PKG_DEL.m anymore. * admin/octpkg/post_install.m: Idem. * admin/octpkg/INDEX: Add stk_init to the INDEX. * config/stk_config_path.m: Do not look for PKG_ADD to detect Octave package mode, since there no longer is a PKG_ADD file. Instead, rely on a hard-coded STK_OCTAVE_PACKAGE variable, which is modified at build time by build_octpkg (similarly to the one in stk_init). * config/stk_config_rmpath.m: Modify comment. * config/stk_config_addpath.m: Modify comment. * admin/octpkg/PKG_DEL.m: Removed. Instead, a PKD_DEL directive has been inserted in stk_init. 2015-06-15 Julien Bect Avoid unnecessary calls to stk_commonsize. * misc/distrib/stk_distrib_bivnorm_cdf.m: Avoid unnecessary calls to stk_commonsize. * misc/distrib/stk_distrib_normal_cdf.m: Idem. 2015-06-12 Julien Bect stk_commonsize.m: Avoid unnecessary calls to repmat. * arrays/generic/stk_commonsize.m: Avoid unnecessary calls to repmat. 2015-06-11 Julien Bect stk_commonsize.m: Accept empty dimensions * arrays/generic/stk_commonsize.m: Accept empty dimensions, under the condition that all input arguments have the same empty dimensions (in which case the result is empty). 2015-06-10 Julien Bect @stk_dataframe/subsasgn.m: Preserve column names when deleting rows * arrays/@stk_dataframe/subsasgn.m: Preserve column names when deleting rows, even if the resulting array is empty. 2015-06-02 Julien Bect wfg.c: Improve portability again * misc/pareto/private/wfg.c: Improve portability again. Now all variables are declared at the beginning of functions (as required by the C89 standard). And some unused headers have been removed, too. 2015-05-29 Julien Bect stk_distrib_bivnorm_cdf.m: Bugfix * misc/distrib/stk_distrib_bivnorm_cdf.m: Fix a bug in the case of mixtures of singular and non-singular cases. Add unit test. 2015-05-28 Julien Bect wfg.c: Remove C99-specific code (stdbool.h). * misc/pareto/private/wfg.c: Remove C99-specific code (stdbool.h). 2015-05-27 Julien Bect stk_pmisclass.m: Compute the probability of misclassification * utils/stk_pmisclass.m: New function to compute the probability of misclassification with respect to a given threshold (either the current probability of misclassification or the expectation of the future probability of misclassification). * examples/02_design_of_experiments/stk_example_doe04.m: Example script that demonstrates the use of stk_pmisclass (). stk_dominatedhv.m: New function to compute dominated hypervolumes. * misc/pareto/stk_dominatedhv.m: New function to compute dominated hypervolumes, which uses WFG 1.10 internally * misc/pareto/private/stk_dominatedhv_mex.c: MEX-file wrapper for WFG * admin/octpkg/INDEX: Add new function to the index * admin/octpkg/Makefile: Add new MEX-file to the Makefile * config/stk_config_makeinfo.m:Add new MEX-file to the build list Import WFG 1.10. * misc/pareto/private/wfg.c: Main WFG source file, with minor changes * misc/pareto/private/wfg.h: Main WFG header, with minor changes * misc/pareto/private/wfg.README: WFG README + ChangeLog + Copyright * admin/build_tools/build_octpkg.m: Ignore wfg.README. Make it possible to have several source files for one MEX. * config/stk_config_buildmex.m: Make it possible to have several source files for one MEX. * config/stk_config_makeinfo.m: Existing MEX-files do not have any additional source file. Move Pareto-related functions to misc/pareto. * arrays/generic/private/stk_isdominated_mex.c: moved from * misc/pareto/private/stk_isdominated_mex.c: moved to * arrays/generic/private/stk_paretofind_mex.c: moved from * misc/pareto/private/stk_paretofind_mex.c: moved to * arrays/generic/stk_isdominated.m: moved from * misc/pareto/stk_isdominated.m: moved to * arrays/generic/stk_paretofind.m: moved from * misc/pareto/stk_paretofind.m: moved to * admin/octpkg/INDEX: Create a dedicated section in the index * config/stk_config_makeinfo.m: Update make info * config/stk_config_path.m: Add new directory to the path 2015-05-24 Julien Bect Clear persistent variables in stk_init * config/stk_config_clearpersistents.m: New function that unlocks all possibly mlock-ed STK files and clears all STK functions that contain persistent variables. * stk_init.m: Call stk_config_clearpersistents. * admin/RELEASE.md: Update release instructions. 2015-05-20 Julien Bect @stk_dataframe/set.m: Fix stk_error calls (missing mnemonic) * arrays/@stk_dataframe/set.m: Fix stk_error calls (missing mnemonic) stk_param_estim.m: Make sure that lnv0 falls within the bounds * paramestim/stk_param_estim.m (get_default_bounds_lnv): Make sure that lnv0 falls within the bounds returned by get_default_bounds_lnv. 2015-05-19 Julien Bect stk_optim_hasfmincon.m: Improve fmincon detection * misc/optim/stk_optim_hasfmincon.m: Try to use fmincon to check that it is there, instead of relying on the result of the exist function (closes ticket #30). 2015-05-17 Julien Bect admin/octpkg/Makefile: Use $(MKOCTFILE) if defined * admin/octpkg/Makefile: Use $(MKOCTFILE) if defined stk_runtests.m: Make sure that all Octave warnings are disabled * misc/test/stk_runtests.m: Make sure that all Octave warnings are disabled Fix %!shared blocks in unit tests. * arrays/@stk_hrect/stk_normalize.m: Fix unit test. * arrays/generic/stk_feval.m: Fix unit test. 2015-04-22 Julien Bect Improve indexing (subasgn/subsref) for stk_dataframe objects. * arrays/@stk_dataframe/subsasgn.m: Preserve row names and column names when it is possible (closes ticket #21). * arrays/@stk_dataframe/subsref.m: Allow for several levels of indexing in the case of ()-indexing. stk_dataframe.m: Add help text * arrays/@stk_dataframe/stk_dataframe.m: Add help text (closes ticket #26). 2015-04-21 Julien Bect stk_hrect.m: Add help text * arrays/@stk_hrect/stk_hrect.m: Add help text (closes ticket #27). 2015-04-20 Julien Bect stk_boundingbox.m: Add doc and overload for several classes (ticket #28) * arrays/generic/stk_boundingbox.m: Add doc. Handle plain arrays only. * arrays/@stk_dataframe/stk_boundingbox.m: Overload. * arrays/@stk_factorialdesign/stk_boundingbox.m: Overload. * arrays/@stk_hrect/stk_boundingbox.m: Overload. * arrays/@struct/stk_boundingbox.m: Overload. 2015-04-05 Julien Bect stk_feval.m: Update documentation. * stk_feval.m: Update documentation. 2015-03-11 Julien Bect stk_feval.m: Implement vectorized calls and use them by default. * arrays/generic/stk_feval.m: Implement vectorized calls and use them by default. * paramestim/stk_param_relik.m: Fix unit test. Fix progress indicator in stk_feval. * arrays/generic/stk_feval.m: Restore the progress indicator. * misc/text/stk_disp_progress.m: Fix progress message. 2015-03-04 Julien Bect stk_distrib_normal_cdf.m: Fix the zero-variance case * misc/distrib/stk_distrib_normal_cdf.m: Fix the zero-variance case. Add unit tests. Fix bugs in stk_distrib_*_ei functions. * misc/distrib/stk_distrib_normal_ei.m: Fix bug (input argument "minimize" was not properly taken into account). * misc/distrib/stk_distrib_student_ei.m: Fix bug (input argument "minimize" was not properly taken into account). 2015-02-21 Julien Bect Optimize for speed * misc/distrib/stk_distrib_normal_cdf.m: Optimize for speed * covfcs/stk_gausscov_aniso.m: Optimize for speed * covfcs/stk_materncov32_aniso.m: Optimize for speed * covfcs/stk_materncov52_aniso.m: Optimize for speed * covfcs/stk_materncov_aniso.m: Optimize for speed 2015-02-18 Julien Bect stk_feval.m: Do not return an stk_dataframe object systematically * arrays/generic/stk_feval.m: Return an stk_dataframe object only if the input x itself is an stk_dataframe object. Optimize for speed (and fix a tiny bug) * arrays/@stk_dataframe/stk_dataframe.m: Optimize for speed * arrays/@stk_dataframe/set.m: Optimize for speed (and fix a tiny bug) * arrays/@stk_dataframe/horzcat.m: Optimize for speed * arrays/@stk_dataframe/vertcat.m: Optimize for speed * arrays/@stk_dataframe/subsref.m: Optimize for speed * arrays/generic/stk_feval.m: Optimize for speed 2015-02-17 Julien Bect Initialize model.param with NaNs. * core/stk_model.m: Initialize model.param with NaNs. * core/stk_predict.m: Fix unit tests. * covfcs/stk_discretecov.m: Fix unit tests. * covfcs/stk_gausscov_aniso.m: Fix unit tests. * covfcs/stk_gausscov_iso.m: Fix unit tests. * covfcs/stk_materncov32_aniso.m: Fix unit tests. * covfcs/stk_materncov32_iso.m: Fix unit tests. * covfcs/stk_materncov52_aniso.m: Fix unit tests. * covfcs/stk_materncov52_iso.m: Fix unit tests. * covfcs/stk_materncov_aniso.m: Fix unit tests. * covfcs/stk_materncov_iso.m: Fix unit tests. * utils/stk_conditioning.m: Fix unit tests. * utils/stk_generate_samplepaths.m: Fix unit tests. 2015-02-11 Julien Bect stk_feval.m: Accept any object that implement feval * arrays/generic/stk_feval.m: Accept any object that implement feval (not just strings and function handles). 2015-02-10 Julien Bect stk_feval.m: Fix backward compatibility issues * arrays/generic/stk_feval.m: Fix backward compatibility issue. Old-style STK structures, where the data is contained in a field named 'a', were not dealt with properly. Add unit test. * core/stk_predict.m: Convert xi to double (same reason). * paramestim/stk_param_estim.m: Convert zi to double (same reason). * arrays/@struct/stk_length.m: New function. 2015-02-09 Julien Bect stk_hrect.m: Provide default constructor * arrays/@stk_hrect/stk_hrect.m: Provide default constructor 2015-02-04 Julien Bect Overload uplus, uminus for stk_dataframe objects. * arrays/@stk_dataframe/uminus.m: Overload uminus. * arrays/@stk_dataframe/uplus.m: Overload uplus. * arrays/@stk_factorialdesign/uminus.m: Overload uminus. stk_feval.m: Accept multivariate outputs (closes #20) * arrays/generic/stk_feval.m: Accept functions with multivariate outputs (i.e., outputs with several columns). Improve the construction of the output dataframe (column names). Add unit tests. stk_feval.m: Fix a bug related to column names * arrays/generic/stk_feval.m: Fix a bug related to column names. 2015-02-03 Julien Bect @stk_dataframe/apply, min, max: Return more than one output argument * arrays/@stk_dataframe/apply.m: Return more than one output argument * arrays/@stk_dataframe/max.m: Return more than one output argument * arrays/@stk_dataframe/min.m: Return more than one output argument stk_param_relik.m: Improve the computation of G = W' * K * W * paramestim/stk_param_relik.m: Compute G = W' * K * W in such a way that the result is always (?) symmetric. 2015-01-28 Julien Bect stk_predict.m: Compute lambda_mu and RS only when necessary * core/stk_predict.m: Compute lambda_mu and RS only when necessary, depending on the number of output arguments. Add unit tests. stk_param_init.m: Handle the heteroscedastic case * paramestim/stk_param_init.m: Handle the heteroscedastic case with known variance properly. Error in the heteroscedastic case with unknown variance. Add unit tests. 2015-01-27 Julien Bect stk_param_init.m: Fix a bug. * paramestim/stk_param_init.m (paraminit_): Fix a bug. 2015-01-25 Julien Bect stk_dataframe.m: Make sure that the output is an stk_dataframe * arrays/@stk_dataframe/stk_dataframe.m: Make sure that the output is an stk_dataframe object. Add unit tests. 2015-01-24 Julien Bect Overload a few base functions for stk_dataframe objects * arrays/@stk_dataframe/sort.m: Overload base function * arrays/@stk_dataframe/mtimes.m: Overload base function 2015-01-23 Julien Bect stk_conditioning.m: Overload for stk_dataframe objects * arrays/@stk_dataframe/stk_conditioning.m: Overload stk_conditioning for stk_dataframe inputs. The output is an stk_dataframe object if either LAMBDA or ZSIM is an stk_dataframe object. * utils/stk_conditioning.m: Do not convert the output into an stk_dataframe object. stk_generate_samplepaths.m: Overload for stk_dataframe objects * arrays/@stk_dataframe/stk_generate_samplepaths.m: Overload stk_generate_samplepaths for stk_dataframe inputs. The output is always an stk_dataframe object. * utils/stk_generate_samplepaths.m: Simplify the code using the assumption that none of the inputs is an stk_dataframe object. The output is an stk_dataframe object if and only if model.response_name exists and is a non-empty string. 2015-01-21 Julien Bect stk_feval.m: Various improvements. * arrays/generic/stk_feval.m: Update documentation. Try to make the code clearer. Use stk_disp_progress. stk_disp_progress.m: Display a progress indicator. * misc/text/stk_disp_progress.m: New function that displays a textual progress indicator. 2015-01-21 Emmanuel Vazquez stk_feval.m: Generalize to the case of a cell array of functions * arrays/generic/stk_feval.m: Generalize to the case of a cell array of functions (ticket #19 closed). 2015-01-08 Julien Bect Improve conditional simulation examples. * examples/01_kriging_basics/stk_example_kb05.m: Add documentation. * examples/01_kriging_basics/stk_example_kb09.m: New example. stk_generate_samplepaths.m: Fix conditioning on noisy observations * utils/stk_generate_samplepaths.m: Fix conditioning on noisy observations, which was not implemented properly until now. stk_conditioning.m: Implement conditioning on noisy observations * utils/stk_conditioning.m: Simulate sample paths conditioned on noisy observations when the additional NOISE_SIM argument is provided. 2015-01-07 Julien Bect stk_generate_samplepaths.m: Do not simulate observation noise. * utils/stk_generate_samplepaths.m: Do not add observation noise to the generated sample paths. This is consistent with stk_predict, which returns posterior variances for the unknown function, not for future noisy observations. 2014-12-31 Julien Bect Accept empty dim in sampling functions. * sampling/stk_sampling_halton_rr2.m: Accept empty dim argument when box is provided, in which case dim is guessed from the dimension of box if provided, and defaults to one otherwise. * sampling/stk_sampling_maximinlhs.m: Idem. * sampling/stk_sampling_olhs.m: Idem. * sampling/stk_sampling_randomlhs.m: Idem. * sampling/stk_sampling_randunif.m: Idem. * sampling/stk_sampling_regulargrid.m: Idem. Use @stk_hrect objects wherever it is useful (work in progress). * examples/01_kriging_basics/stk_example_kb03.m: Use @stk_hrect. * examples/02_design_of_experiments/stk_example_doe03.m: Use @stk_hrect. * misc/test/stk_is_lhs.m: Use @stk_hrect. * paramestim/stk_param_init.m: Use @stk_hrect. * sampling/stk_sampling_halton_rr2.m: Use @stk_hrect. * sampling/stk_sampling_maximinlhs.m: Use @stk_hrect. * sampling/stk_sampling_olhs.m: Use @stk_hrect. * sampling/stk_sampling_randomlhs.m: Use @stk_hrect. * sampling/stk_sampling_randunif.m: Use @stk_hrect. * sampling/stk_sampling_regulargrid.m: Use @stk_hrect. A few additional methods for the @stk_dataframe class. * arrays/@stk_dataframe/diff.m: Overload base function. * arrays/@stk_dataframe/ismember.m: Overload base function. * arrays/@stk_dataframe/xlim.m: Overload base function. * arrays/@stk_dataframe/ylim.m: Overload base function. Overhaul stk_normalize and stk_rescale functions. * arrays/@stk_dataframe/stk_normalize.m: Overhaul. * arrays/@stk_dataframe/stk_rescale.m: Overhaul. * arrays/@stk_factorialdesign/stk_normalize.m: Overhaul. * arrays/@stk_factorialdesign/stk_rescale.m: Overhaul. * arrays/generic/stk_normalize.m: Overhaul. * arrays/generic/stk_rescale.m: Overhaul. stk_boundingbox.m: New function to create bounding boxes. * arrays/generic/stk_boundingbox.m: New function to create bounding boxes as @stk_hrect object. * admin/octpkg/INDEX: Add new functions to the index. New @stk_hrect class to represent hyper-rectangles. * arrays/@stk_hrect/stk_hrect.m: Constructor for the new @stk_hrect class. * arrays/@stk_hrect/axis.m: Overload base function. * arrays/@stk_hrect/disp.m: Overload base function. * arrays/@stk_hrect/display.m: Overload base function. * arrays/@stk_hrect/get.m: Overload base function. * arrays/@stk_hrect/horzcat.m: Overload base function. * arrays/@stk_hrect/ismember.m: Overload base function. * arrays/@stk_hrect/stk_normalize.m: Overload STK function. * arrays/@stk_hrect/stk_rescale.m: Overload STK function * arrays/@stk_hrect/subsasgn.m: Overload base function. * arrays/@stk_hrect/subsref.m: Overload base function. * arrays/@stk_hrect/vertcat.m: Overload base function. * admin/octpkg/INDEX: Add new functions to the index. Improve plot helper functions. * misc/plot/stk_get_axis_arg.m: New function to help handling the options axes argument that most plotting functions have. * misc/plot/stk_xlabel.m: Use stk_get_axis_arg. * misc/plot/stk_ylabel.m: Use stk_get_axis_arg. * misc/plot/stk_zlabel.m: New function, similar to stk_xlabel and stk_ylabel. * misc/options/stk_options_set.m: Add options for stk_zlabel. 2014-12-09 Julien Bect stk_distrib_bivnorm_cdf: Compute bivariate normal probabilities. * misc/distrib/stk_distrib_bivnorm_cdf.m: Compute bivariate normal probabilities (with any means, standard deviations and corrrelation coefficients). Supports broadcasting. Accurate computation of [p, q] even when p or q is close to one. * misc/distrib/private/stk_distrib_bivnorm0_cdf.c: C MEX-file for the computation of standard bivariate probabilities (zero means, unit variances). * admin/octpkg/INDEX: Hide stk_distrib_bivnorm_cdf.m, currently considered as an internal function. * admin/octpkg/Makefile: Add __stk_distrib_bivnorm0_cdf__ to the list of targets. * config/stk_config_makeinfo.m: Add stk_distrib_bivnorm0_cdf. 2014-12-03 Julien Bect stk_sampling_randunif.m: Fix input argument checking. * sampling/stk_sampling_randunif.m: Fix input argument checking. stk_sampling_randunif.m: Accept empty dim when box is provided. * sampling/stk_sampling_randunif.m: Accept empty dim argument when box is provided, in which case dim is guessed from the dimension of box. 2014-11-20 Julien Bect stk_param_estim.m: Provide a value for param0 if needed. * paramestim/stk_param_estim.m: Provide a value for param0 if needed. stk_param_estim.m: Empty is the same as not provided. * paramestim/stk_param_estim.m: Empty is the same as not provided. stk_param_estim.m: Simplify variable names. * paramestim/stk_param_estim.m: Simplify variable names, param0lnv -> lnv0, paramlnvopt -> lnvopt. stk_param_estim.m: Always return something meaningful for lnv. * paramestim/stk_param_estim.m: Always return something meaningful for lnv: when the variance of the noise is not estimated, return model.lognoisevariance. Update the function documentation following this and earlier changes. 2014-11-08 Julien Bect stk_param_estim.m: Estimate lnv if lognoisevariance is nan. * paramestim/stk_param_init_lnv.m: New function that provides a rough estimate of the variance of the noise for a given model. * admin/octpkg/INDEX: Include stk_param_init_lnv.m. * paramestim/stk_param_estim.m: Estimate the variance of the noise if the lognoisevariance field is nan, using as a starting point the value returned by stk_param_init_lnv. * examples/01_kriging_basics/stk_example_kb04.m: Demonstrate how it is possible to estimate the variance of the noise without providing a initial guess for it. 2014-11-06 Julien Bect Handle empty lognoisevariance field as if missing. * core/stk_make_matcov.m: Handle empty lognoisevariance field as if missing. * core/stk_model.m: Idem. * doc/dev/model.texi: Idem. * paramestim/stk_param_estim.m: Idem. * paramestim/stk_param_init.m: Idem. * paramestim/stk_param_relik.m: Idem. 2014-11-03 Julien Bect Add a 'pairwise' argument to stk_noisecov. * covfcs/stk_noisecov.m: Add a 'pairwise' argument. * core/stk_make_matcov.m: Use the new 'pairwise' argument. 2014-11-02 Julien Bect stk_param_init.m: Change the behaviour regarding lnv. * paramestim/stk_param_init.m: defaults to using the input value of model.lognoisevariance if it is not nan, and estimating the variance if it is nan. The meaning of the fifth argument, now called DO_ESTIM_LNV, has also slightly changed: it is used to force or prevent the estimation of the variance of the noise, regardless of the value of model.lognoisevariance. * examples/03_miscellaneous/stk_example_misc03.m: Display the two models that have been used in this example. * doc/dev/model.texi: update accordingly. 2014-10-26 Julien Bect Make lognoisevariance a mandatory field in model structures. * core/stk_model.m: Make lognoisevariance a mandatory field in model structures, with default value -inf. For backward compatibility, stk_discrete_cov models can still be created with model structures that lack a lognoisevariance field. * core/stk_make_matcov.m: For backward compatibility, a lognoisevariance field with value -inf is added if absent. * paramestim/stk_param_estim.m: idem. * paramestim/stk_param_init.m: idem. * paramestim/stk_param_relik.m: idem + remove NOISYOBS variable. * covfcs/stk_discretecov.m: Modify unit test accordingly. * doc/dev/model.texi: Record design notes and ideas about model structures (not meant to be released as a user-level doc). 2014-10-09 Julien Bect Add the Goldstein-Price test function. * examples/test_functions/stk_testfun_goldsteinprice.m: Goldstein-Price test function. 2014-09-29 Julien Bect Polish stk_sprintf_colvect_* functions. * misc/text/stk_sprintf_colvect_fixedpoint.m: Use round instead of floor. Polish formatting. * misc/text/stk_sprintf_colvect_scientific.m: Polish formatting. 2014-09-28 Julien Bect @stk_dataframe/plot.m: Fix two problems. * arrays/@stk_dataframe/plot.m: Fix two problems. stk_config_rmpath.m: Use strrep instead of regexprep. * config/stk_config_rmpath.m: Use strrep instead of regexprep for compatiblity with Octave 3.2.x (see comments inside the file). 2014-09-27 Julien Bect PKG_DEL.m: Use addpath instead of cd. * admin/octpkg/PKG_DEL.m: Use addpath instead of cd. stk_param_getdefaultbounds.m: Avoid -Inf in default bounds. * paramestim/stk_param_getdefaultbounds.m: Avoid -Inf in default bounds. 2014-09-25 Julien Bect Fix a problem related to Octave 3.2.x when STK is used as a package. * config/stk_config_path.m: Add private folder to the path in Octave 3.2.x even when STK is used as a package. Fix a problem with @stk_factorialdesign/fieldnames.m. * arrays/@stk_factorialdesign/fieldnames.m: Concatenate cell arrays of strings, but not a string with a cell array of strings since the latter syntax is not supported in Octave 3.2.x. Add @stk_factorialdesign/private to the path when using Octave 3.2.x. * config/stk_config_path.m: Add @stk_factorialdesign/private to the path when using Octave 3.2.x. 2014-09-22 Julien Bect Robustify a private function. * arrays/@stk_factorialdesign/private/plot_surfmeshcontour.m: Make the function work with old versions of octave where, for some plotting functions (e.g., pcolor in Octave 3.6.4) the full syntax with axes handle and parameter/value pairs is not supported. Make stk_config_rmpath work on Windows systems. * config/stk_config_rmpath.m: Make stk_config_rmpath work on Windows systems (pathsep must be used instead of ':' since ':' is not the path separator for Windows...). 2014-09-20 Julien Bect Provide a replacement for missing isrow. * misc/mole/isrow/isrow.m: Replacement for isrow. * config/stk_config_mole.m: Add our isrow function to the path if necessary (e.g., Matlab R2007a). Fix a tiny bug in stk_param_estim. * paramestim/stk_param_estim.m: Use strcmpi instead of strcmp to compare err.identifier to 'matlab:optimset:invalidparamname' on line 167. I wonder if this line has ever worked properly... (only affects old releases of Matlab, e.g.,R2007a). Don't use ~ to ignore arguments. * admin/build_tools/build_octpkg.m: Don't use ~ to ignore arguments. * utils/stk_generate_samplepaths.m: Don't use ~ to ignore arguments. 2014-09-15 Julien Bect stk_param_relik.m: Optimize the case of simple kriging. * paramestim/stk_param_relik.m: Optimize the case of simple kriging. 2014-09-09 Paul Feliot doc: Update help text for several functions. * covfcs/stk_materncov32_aniso.m: Update help text. * covfcs/stk_materncov32_iso.m: Update help text. * covfcs/stk_materncov52_aniso.m: Update help text. * covfcs/stk_materncov52_iso.m: Update help text. * covfcs/stk_materncov_aniso.m: Update help text. * covfcs/stk_materncov_iso.m: Update help text. * paramestim/stk_param_init.m: Update help text. 2014-09-02 Julien Bect Rename LICENSE to COPYING. * LICENSE: Renamed to COPYING. * COPYING: Formerly known as LICENSE. * README: Update reference to LICENSE. * admin/build_tools/build_forgedoc.m: No more need to rename. * admin/build_tools/build_octpkg.m: No more need to rename. * admin/find_nonstandard_characters.sh: Update reference to LICENSE. * admin/fix_eol.sh: Update reference to LICENSE. Rename WHATSNEW to NEWS. * NEWS: Formerly known as WHATSNEW. This version is for release 2.1.1 (we still have to update it to 2.2.0). From now on, we will always keep a version of this file in the default branch. * admin/build_tools/build_forgedoc.m: No need to rename WHATSNEW to NEWS anymore. * admin/build_tools/build_octpkg.m: Same thing. 2014-08-20 Julien Bect Add CITATION file. * CITATION: Explain how to cite STK in publications. 2014-08-18 Julien Bect Document stk_length. * arrays/generic/stk_length.m: Add doc. * arrays/@stk_dataframe/stk_length.m: Fix doc. * admin/octave-pkg/INDEX: Un-hide stk_length. 2014-08-17 Julien Bect Deprecate stk_plot2d. * misc/plot/stk_plot2d.m: Deprecated. * arrays/@stk_factorialdesign/contour.m: Overload base function. * arrays/@stk_factorialdesign/mesh.m: Overload base function. * arrays/@stk_factorialdesign/meshc.m: Overload base function. * arrays/@stk_factorialdesign/meshz.m: Overload base function. * arrays/@stk_factorialdesign/pcolor.m: Overload base function. * arrays/@stk_factorialdesign/surf.m: Overload base function. * arrays/@stk_factorialdesign/private/plot_surfmeshcontour.m: Provide a common implementation for overloading surf/contour/... * examples/01_kriging_basics/stk_example_kb03.m: Use contour and pcolor. * examples/03_miscellaneous/stk_example_misc04.m: Use pcolor. * admin/octave-pkg/INDEX: Update with the new functions. Hide stk_plot2d. @stk_dataframe/plot.m: Hold on after the first plot. * arrays/@stk_dataframe/plot.m: Hold on after the first plot, if there are several (fixes a bug introduced yesterday). 2014-08-16 Julien Bect @stk_dataframe/plot.m: Full rewrite again. * arrays/@stk_dataframe/plot.m: Full rewrite again, to improve even more compatibility with the base plot function. The case where x is an stk_dataframe objects with two or more columns is now handled in a way that is consistent with the base plot function (i.e., if x has two columns, then we get two 1D plots). 2014-08-15 Julien Bect stk_plot1d.m: Add missing documentation. * misc/plot/stk_plot1d.m: Add doc. @stk_dataframe/plot.m: Full rewrite. * arrays/@stk_dataframe/plot.m: Full rewrite to improve compatibility with the base plot function. Deprecate the case where x is an stk_dataframe objects with two or more columns. 2014-08-14 Julien Bect Add missing documentations. * arrays/@stk_factorialdesign/ndgrid.m: Add doc. * covfcs/stk_discretecov.m: Add doc. 2014-08-13 Julien Bect Use "z" instead of "x" in all stk_distrib_* functions. * misc/distrib/stk_distrib_normal_cdf.m: Use "z" instead of "x". * misc/distrib/stk_distrib_normal_ei.m: Idem. * misc/distrib/stk_distrib_normal_pdf.m: Idem. * misc/distrib/stk_distrib_student_cdf.m: Idem. * misc/distrib/stk_distrib_student_ei.m: Idem. * misc/distrib/stk_distrib_student_pdf.m: Idem. Provide a documentation for EI functions. * misc/distrib/stk_distrib_normal_ei.m: Add doc. * misc/distrib/stk_distrib_student_ei.m: Add doc. 2014-08-12 Julien Bect Improve Octave packaging. * admin/make_octave_package.m: Delete rename_mex.sed after use. Rename test script. * admin/MAKE_OCTAVE_PACKAGE.md: New doc file (in markdown). * admin/octave-pkg/test_package.m: Renamed to * admin/octave-pkg/pkg_install_stk_and_generate_doc.m: Renamed from. 2014-08-10 Julien Bect stk_example_misc04.m: Fix property name. * examples/03_miscellaneous/stk_example_misc04.m: Fix property name (YTickLabels --> YTickLabel). stk_example_misc04.m: Fix for Octave compatiblity. * examples/03_miscellaneous/stk_example_misc04.m: Fix for Octave compatiblity (stairs does not accept stk_datafrm objects in Octave). 2014-08-08 Julien Bect Fix and improve stk_factorialdesign's accessors. * arrays/@stk_factorialdesign/subsasgn.m: New function. Override stk_dataframe's subsasgn to prevent illegal modifications of stk_factorialdesign objects through ()-type indexing. Any such modification results in an implicit cast to stk_dataframe. * arrays/@stk_factorialdesign/get.m: Provide read-only access to the underlying stk_dataframe object. * arrays/@stk_factorialdesign/set.m: The result is implicitely cast into an stk_dataframe object upon any modification that would otherwise corrupt the internal structure of the stk_factorialdesign object. * arrays/@stk_factorialdesign/fieldnames.m: Add .stk_dataframe. 2014-08-07 Julien Bect Simplify the display of stk_factorialdesign objects. * arrays/@stk_factorialdesign/stk_sprintf.m: Simplify the display of stk_factorialdesign objects by hiding the ".stk_dataframe" level (i.e., .info is used as an aliad for .stk_dataframe.info). * arrays/@stk_dataframe/stk_sprintf.m: Modified (tiny change). Define list of field names for stk_factorialdesign objects. * arrays/@stk_factorialdesign/fieldnames.m: Define list of field names for stk_factorialdesign objects. Fix list of field names for stk_dataframe objects. * arrays/@stk_dataframe/private/reserved_field_names.m: Fix list of field names for stk_dataframe objects. * arrays/@stk_dataframe/fieldnames.m: Update unit test. 2014-07-31 Julien Bect Modify the behaviour of vertcat/horzcat for stk_dataframe objects. * arrays/@stk_dataframe/horzcat.m: Modified. The result is always an stk_dataframe object, and has row names iff either one of the two arguments doesn't have row names, or the row names of both arguments agree. * arrays/@stk_dataframe/vertcat.m: Similar changes. Modify the behaviour of bsxfun for stk_dataframe objects. * arrays/@stk_dataframe/bsxfun.m: Modified. The result is always an stk_dataframe object, and has column names iff either one of the two arguments doesn't have columns names or the columns names of both arguments agree. * arrays/@stk_factorialdesign/stk_factorialdesign.m: Modified unit test. * arrays/@stk_dataframe/abs.m: Overload abs for stk_dataframe object. This allows to write abs (x) instead of abs (double (x)) or abs (x.data). 2014-07-24 Julien Bect Accept invRho = 0 in anisotropic covariance functions. * covfcs/stk_gausscov_aniso.m: Accept invRho = 0. * covfcs/stk_materncov32_aniso.m: Idem. * covfcs/stk_materncov52_aniso.m: Idem. * covfcs/stk_materncov_aniso.m: Idem. stk_sprintf_colvect_scientific.m: Fix a bug. * misc/text/stk_sprintf_colvect_scientific.m: Fix a bu related to rounding numbers such as 9.99e02 (which were displayed as 10e+02 instead of 1e+03). * arrays/@stk_dataframe/stk_sprintf.m: Set default width to 8. * misc/text/stk_sprintf_colvect.m: Idem. * misc/text/stk_sprintf_colvect_fixedpoint.m: Idem. 2014-07-23 Julien Bect stk_param_estim.m: Warn about constant-response data. * paramestim/stk_param_estim.m: Warn about constant-response data. 2014-07-22 Julien Bect stk_param_init.m: Warn about constant-response data. * paramestim/stk_param_init.m: Warn about constant-response data. stk_param_relik.m: Check symmetry of G = W' * K * W. * paramestim/stk_param_relik.m: Check if G = W' * K * W and apply a naive fix if it is not (+ emit a warning). * config/stk_config_setup.m: Do not display the new warning. * core/stk_cholcov.m: Only issue one warning if using epsi. Improve the implementation of stk_dataframe objects display. * arrays/@stk_dataframe/disp.m: Modified. * arrays/@stk_dataframe/display.m: Modified. * arrays/@stk_factorialdesign/stk_sprintf_levels.m: Modified. * arrays/@stk_dataframe/stk_sprintf.m: New function. * arrays/@stk_factorialdesign/stk_sprintf.m: New function. * arrays/generic/stk_sprintf.m: New function. * arrays/@stk_dataframe/stk_sprintf_data.m: Removed. * arrays/@stk_factorialdesign/disp.m: Removed. * arrays/generic/stk_sprintf_data.m: Removed. Implement stk_sprintf_sizetype for cell arrays. * arrays/@cell/stk_sprintf_sizetype.m: Implement stk_sprintf_sizetype for cell arrays. * arrays/@stk_dataframe/stk_sprintf_sizetype.m: Minor formatting change in the output string (remove spaces). * arrays/generic/stk_sprintf_sizetype.m: Idem. 2014-07-21 Julien Bect stk_config_buildmex.m: Run silently when doing nothing. * config/stk_config_buildmex.m: Run silently when doing nothing. Remove page_screen_output (not needed anymore). * misc/mole/matlab/page_screen_output.m: Deleted (not needed anymore). Stop bothering users at startup. * stk_init.m: Stop bothering users at startup with information that they can find in the README file anyway. Don't display selected optimizers at startup. * misc/optim/stk_select_optimizer.m: Don't display selected optimizers when called without input arguments (typically, during startup). 2014-07-20 Julien Bect stk_config_setup.m: Call stk_parallel_engine_set. * config/stk_config_setup.m: Call stk_parallel_engine_set. Get rid of stk_parallel_haspct. * misc/parallel/stk_parallel_haspct.m: Deleted. * admin/octave-pkg/INDEX: Modified. * misc/parallel/stk_parallel_start.m: Modified. stk_config_setup.m: Don't bother checking if the PCT is installed. * config/stk_config_setup.m: in Matlab, don't bother checking if the PCT is installed. 2014-07-19 Julien Bect New example script illustrating random Pareto fronts. * examples/03_miscellaneous/stk_example_misc04.m: New script. 2014-07-18 Julien Bect Add an option to control the verbosity fmincon/fminsearch. * misc/options/stk_options_set.m: Add new option 'optim_display_level' with default value 'off'. * paramestim/stk_param_estim.m: Use the new option. * paramestim/stk_param_init.m: Don't display debugging info. 2014-07-14 Julien Bect stk_plot1d.m: Improved flexibility in argument handling. * misc/plot/stk_plot1d.m: Improved flexibility in the way input arguments are handled. 2014-07-03 Julien Bect Global options to control upper/lower bounds for param estim. * misc/options/stk_options_set.m: Add new options. * paramestim/stk_param_getdefaultbounds.m: Read global options. stk_param_estim.m: Return an additional 'info' structure. * paramestim/stk_param_estim.m: Return an additional 'info' structure, which currently contains the criterion that has been used, the criterion value at the optimum, and the bounds. 2014-07-02 Julien Bect stk_generate_samplepaths.m: Use model.response_name if available. * utils/stk_generate_samplepaths.m: Use model.response_name if available. 2014-07-01 Julien Bect stk_isdominated.m: New function, returns true for dominated rows. * arrays/generic/stk_isdominated.m: New function * arrays/generic/private/stk_isdominated_mex.c: New MEX-function * misc/include/pareto.h: Add new function is_dominated * config/stk_config_makeinfo.m: Compile the new MEX-function * admin/octave-pkg/Makefile: Compile the new MEX-function * arrays/generic/private/stk_paretofind_mex.c: Modified * arrays/generic/stk_paretofind.m: Modified stk_figure.m: Do not set the axis title. * misc/plot/stk_figure.m: Do not set the axis title. stk_plot2d.m: Create labels only if column names are available. * misc/plot/stk_plot2d.m: Create labels only if column names are available. * examples/01_kriging_basics/stk_example_kb03.m: Provide explicit column names for the 2d array used in this script. 2014-06-27 Julien Bect stk_cholcov.m: Prevent infinite while loops. * core/stk_cholcov.m: Prevent infinite while loops, that could occur in the case of matrices that either contained nans or Infs, or were really far from from positive definite. 2014-06-25 Ashwin Ravisankar stk_param_estim.m: Add an optional 'criterion' argument. * paramestim/stk_param_estim.m: added new input argument criterion that will make it possible, in the future, to select which estimation criterion to use. stk_param_relik.m: Add a unit test to check the gradient. * paramestim/stk_param_relik.m: Add a unit test. 2014-06-19 Ashwin Ravisankar stk_param_gls.m: A new function to compute the GLS estimator. * paramestim/stk_param_gls.m: new function * paramestim/stk_param_init.m: modified 2014-06-16 Julien Bect make_octave_package.m: Parse 'Description' field from README. * admin/make_octave_package.m: Modified to parse 'Description' field directly from README (avoids text duplication). * admin/octave-pkg/description.txt: Deleted. 2014-06-15 Julien Bect stk_paretofind.m: New function to find non-dominated points. * arrays/generic/stk_paretofind.m: new function * arrays/generic/private/stk_paretofind_mex.c: new mex-function * misc/include/pareto.h: new C header * config/stk_config_makeinfo.m: modified * config/stk_config_path.m: modified * admin/octave-pkg/Makefile: modified 2014-06-14 Julien Bect README: Include a short description. * README: Include a short description (from description.txt) * admin/octave-pkg/description.txt: Line-wrapping. stk_options_set.m: Add a reset feature. * misc/options/stk_options_set.m: Add a reset feature using a special case when nargin == 1. * misc/options/stk_options_get.m: Just fix spacing. stk_options_set.m: Prevent persistent from being cleared. * misc/options/stk_options_set.m: Add a call to mlock to prevent the persistent variable from being cleared. 2014-05-15 Julien Bect stk_model.m: Fix a fresh bug (my mistake). * core/stk_model.m: Restore proper default behaviour when nargin == 0. Merge /etc into /admin * etc/CODING_GUIDELINES: moved from * admin/CODING_GUIDELINES: moved to * etc/RELEASE_CHECKLIST: moved from * admin/RELEASE_CHECKLIST: moved to + modified * etc/octave-pkg/INDEX: moved from * admin/octave-pkg/INDEX: moved to * etc/octave-pkg/Makefile: moved from * admin/octave-pkg/Makefile: moved to * etc/octave-pkg/PKG_DEL.m: moved from * admin/octave-pkg/PKG_DEL.m: moved to * etc/octave-pkg/pkg_install_stk_and_generate_doc.m: moved from * admin/octave-pkg/pkg_install_stk_and_generate_doc.m: moved to * etc/octave-pkg/post_install.m: moved from * admin/octave-pkg/post_install.m: moved to * admin/description.txt: moved from * admin/octave-pkg/description.txt: moved to * admin/make_octave_package.m: modified * admin/make_release_targz.sh: modified * admin/stk_make_htmldoc.m: modified 2014-05-13 Julien Bect stk_model.m: Accept function handles for covariance_type. * core/stk_model.m: Accept function handles for covariance_type. 2014-05-13 Emmanuel Vazquez Add a stk_length function * arrays/generic/stk_length.m: returns the length of an array * arrays/@stk_dataframe/stk_length.m: idem 2014-05-12 Julien Bect stk_generate_samplepaths.m: Deal with duplicates in xt. * utils/stk_generate_samplepaths.m: Deal with duplicates in xt. 2014-05-08 Julien Bect Move stk_model to core. * core/stk_model.m: formerly known as utils/stk_model.m * utils/stk_model.m: deleted Move utils/arrays one level up. * arrays: formerly known as utils/arrays * utils/arrays: deleted * config/stk_config_makeinfo.m: modified * config/stk_config_path.m: modified 2014-05-07 Julien Bect @stk_dataframe/subsasgn: Solve a problem with Octave 3.2.x * utils/arrays/@stk_dataframe/subsasgn.m: solve a problem with Octave 3.2.x (0x0 stk_dataframe objects). Avoid changing the current dir to make a function available. * misc/test/stk_runtests.m: Avoid changing the current dir to make stk_config_path available. Use addpath/rmpath instead. 2014-05-06 Julien Bect stk_config_path: Fix a private folder problem in Octave 3.2.x * config/stk_config_path.m: Fix a private folder problem in Octave 3.2.x (a new private folder has been recently created). Use horzcat instead of [,]. * lm/@stk_lm_affine/feval.m: modified * lm/@stk_lm_cubic/feval.m: modified * lm/@stk_lm_quadratic/feval.m: modified Change the way the MOLE is installed. * config/stk_config_mole.m: New function, that takes the place of misc/mole/init.m and misc/mole/install_mole_function.m. * misc/mole/init.m: removed * misc/mole/install_mole_function.m: removed * config/stk_config_addpath.m: Modified, to call stk_config_mole, thus avoiding the use of "run" which seems to be causing problems in Octave 3.2.x. * etc/octave-pkg/post_install.m: idem * stk_init.m: idem 2014-04-15 Julien Bect Add an INDEX file to the Octave package. * etc/octave-pkg/INDEX: INDEX file for the Octave package * etc/octave-pkg/pkg_install_stk_and_generate_doc.m: new script to test quickly that the tarball can be installed and to inspect how the corresponding Octave-forge documentation will look. * admin/make_octave_package: copy INDEX to the package. Don't include stk_optim_hasfmincon in the Octave package. * admin/make_octave_package.m: modified Some functions are not part of the public API. * core/ortho_func.m: modified (doc) * core/stk_cholcov.m: modified (doc) * core/@stk_kreq_qr/get.m: modified (doc) * core/@stk_kreq_qr/isequal.m: modified (doc) * core/@stk_kreq_qr/linsolve.m: modified (doc) * core/@stk_kreq_qr/stk_kreq_qr.m: modified (doc) * core/@stk_kreq_qr/stk_set_righthandside.m: modified (doc) * core/@stk_kreq_qr/stk_squared_seminorm.m: modified (doc) * core/@stk_kreq_qr/stk_update.m: modified (doc) * core/@stk_kreq_qr/subsref.m: modified (doc) * misc/dist/stk_gpquadform.m: modified (doc) 2014-04-14 Julien Bect stk_cholcov: new function, chol + regularization noise * core/stk_cholcov.m: New function. * config/stk_config_setup.m: Change the name of a warning. * paramestim/stk_param_init.m: Use stk_colcov instead of chol. * core/@stk_kreq_qr/get.m: Use stk_colcov instead of chol. * paramestim/stk_param_relik.m: Use stk_cholcov. * examples/01_kriging_basics/stk_example_kb07.m: Increase regularity for the forth subplot. Now we can, so why not? * examples/01_kriging_basics/stk_example_kb08.m: Remove FIXME comment. Change subplot titles. * utils/stk_generate_samplepaths.m: Use stk_colcov instead of chol. Remove FIXME comment. Remove observations points from the result when generating conditional sample paths (bugfix). 2014-04-13 Julien Bect Generation of conditioned sample paths made easy (ticket #3). * utils/stk_generate_samplepaths.m: Generate conditioned sample paths if additional (xi, zi) arguments are provided. * examples/01_kriging_basics/stk_example_kb08.m: New example. 2014-04-12 Julien Bect Move stk_feval.m to utils/arrays/generic. * utils/stk_feval.m: moved (from) * utils/arrays/generic/stk_feval.m: moved (to) 2014-04-10 Julien Bect Fix a bug in stk_predict (). * core/stk_predict.m: Fix a bug 2014-04-03 Julien Bect Simplify the code in stk_ortho_func (). * core/stk_ortho_func.m: Call feval (stk_lm_quadratic, x) instead of duplicating the code. And add the cubic case. Add (multivariate) cubic linear models. * lm/@stk_lm_cubic: New class * lm/@stk_lm_cubic/stk_lm_cubic.m: New function (constructor) * lm/@stk_lm_cubic/feval.m: New function 2014-03-31 Julien Bect Introduce a new (experimental) feature: linear models. * core/stk_ortho_func.m: Modified to handle model.order == nan. * paramestim/stk_param_init.m: Modified to handle model.order == nan. * config/stk_config_path.m: Add lm to the path. * lm/@stk_lm_affine/stk_lm_affine.m: New function * lm/@stk_lm_affine/feval.m: New function * lm/@stk_lm_constant/stk_lm_constant.m: New function * lm/@stk_lm_constant/feval.m: New function * lm/@stk_lm_matrix/stk_lm_matrix.m: New function * lm/@stk_lm_matrix/feval.m: New function * lm/@stk_lm_null/stk_lm_null.m: New function * lm/@stk_lm_null/feval.m: New function * lm/@stk_lm_quadratic/stk_lm_quadratic.m: New function * lm/@stk_lm_quadratic/feval.m: New function * examples/03_miscellaneous/stk_example_misc03.m: New example script. 2014-03-29 Julien Bect Do not add config to in the path. * config/stk_config_path.m: Remove config from the list of STK subdirectories to be added to the path. * stk_init.m: Remove config from the path at the end of initialization. * misc/test/stk_runtests.m: Do not assume that config is in the path. 2014-03-26 Julien Bect Rename stk_config_graphicstoolkit tp graphics_toolkit. * config/stk_config_graphicstoolkit.m: Renamed. * misc/mole/graphics_toolkit/graphics_toolkit.m: Formerly known as stk_config_graphicstoolkit. Modified to be a (partial) replacement of the Octave function with the same name. * misc/mole/init.m: Add graphics_toolkit to the path only when needed, i.e., when using Matlab or an old version of Octave. * examples/03_miscellaneous/stk_example_misc02.m: Modified. stk_param_relik: Adding a little bit of noise to help chol succeed. * paramestim/stk_param_relik.m: Add a little bit of noise to help chol succeed, when the first factorization returned by chol is not complete. Emit a warning when doing so. * config/stk_config_setup.m: By default, hide the warning emitted by stk_param_relik. 2014-03-25 Julien Bect stk_config_addpath: Add MOLE subdirectories to the path. * config/stk_config_addpath.m: modified stk_version: Simpler is better. * config/stk_version.m: Moved... * stk_version.m: ...here. STK's version number is now hard-coded in this file, and read from README anymore. * README: Refer to stk_version.m for the version number. * config/stk_config_path.m: Add STK's root to the path unless STK is used as an Octave package. * etc/RELEASE_CHECKLIST: Related changes. stk_config_getroot: Simpler is better. * config/stk_config_getroot.m: Simplify the way we locate STK's root. Use stk_param_relik instead of stk_test as a reference, as stk_test will probably not be included in the Octave package. * admin/make_octave_package.m: Modified. stk_make_htmldoc: Remove dependency on stk_config_getroot. * admin/stk_make_htmldoc.m: modified. stk_param_relik: Improved implementation, or so I hope. * paramestim/stk_param_relik.m: Several modifications, that seem to reduce the number of warnings related to bad conditioning, and also improve the performance for large n (about 1000, say). Fix minor problems in stk_config_rmpath and stk_config_path. * config/stk_config_path.m: modified * config/stk_config_rmpath.m: modified Test examples using stk_runtests instead of stk_runexamples. * examples/01_kriging_basics/stk_example_kb01.m: add %!test * examples/01_kriging_basics/stk_example_kb02.m: add %!test * examples/01_kriging_basics/stk_example_kb03.m: add %!test * examples/01_kriging_basics/stk_example_kb04.m: add %!test * examples/01_kriging_basics/stk_example_kb05.m: add %!test * examples/01_kriging_basics/stk_example_kb06.m: add %!test * examples/01_kriging_basics/stk_example_kb07.m: add %!test * examples/02_design_of_experiments/stk_example_doe01.m: add %!test * examples/02_design_of_experiments/stk_example_doe02.m: add %!test * examples/02_design_of_experiments/stk_example_doe03.m: add %!test * examples/03_miscellaneous/stk_example_misc01.m: add %!test * examples/03_miscellaneous/stk_example_misc02.m: add %!test * misc/test/stk_runexamples.m: removed * misc/test/stk_runscript.m: removed 2014-03-23 Julien Bect Remove stk_init.m from the Octave package. * admin/make_octave_package.m: Create PKG_ADD.m (later renamed to PKG_ADD) by renaming stk_init. Therefore, we don't need the existing PKG_ADD.m anymore. * stk_init.m: Set STK_OCTAVE_PACKAGE to false. * etc/octave-pkg/PKG_ADD.m: Removed. Minor changes in stk_select_optimizer. * misc/optim/stk_select_optimizer.m: Minor changes. 2014-03-21 Julien Bect stk_param_relik: Fix help text. * paramestim/stk_param_relik.m: Fix help text. 2014-03-18 Julien Bect Restore the stk_ prefix for distrib_* functions. * misc/distrib/distrib_normal_cdf.m: renamed (from) * misc/distrib/distrib_normal_ei.m: renamed (from) * misc/distrib/distrib_normal_pdf.m: renamed (from) * misc/distrib/distrib_student_cdf.m: renamed (from) * misc/distrib/distrib_student_ei.m: renamed (from) * misc/distrib/distrib_student_pdf.m: renamed (from) * misc/distrib/stk_distrib_normal_cdf.m: rename (to) * misc/distrib/stk_distrib_normal_ei.m: rename (to) * misc/distrib/stk_distrib_normal_pdf.m: rename (to) * misc/distrib/stk_distrib_student_cdf.m: rename (to) * misc/distrib/stk_distrib_student_ei.m: rename (to) * misc/distrib/stk_distrib_student_pdf.m: rename (to) * examples/02_design_of_experiments/stk_example_doe03.m: modified * misc/distrib/README: modified 2014-03-17 Julien Bect Handle large values of nu better in stk_sf_matern. * misc/specfun/stk_sf_matern.m: Handle large values of nu better. 2014-03-14 Julien Bect Handle Gaussian covariance functions in stk_param_init. * paramestim/stk_param_init.m: Handle Gaussian covariance functions. * paramestim/stk_param_estim.m: Source formatting. 2014-03-14 Julien Bect Handle special cases in stk_sf_matern. * misc/specfun/stk_sf_gausscorr.m: modified * misc/specfun/stk_sf_matern.m: modified * misc/specfun/stk_sf_matern32.m: modified * misc/specfun/stk_sf_matern52.m: modified 2014-02-26 Julien Bect Improve building and Octave packaging. * admin/make_octave_package.m: modified * stk_build.m: renamed... * config/stk_config_buildmex.m: ...to this; modified. * config/stk_config_makeinfo.m: new function * config/stk_config_rmpath.m: modified * config/stk_config_testprivatemex.m: modified * etc/octave-pkg/Makefile: new file * etc/octave-pkg/PKG_ADD.m: modified * etc/octave-pkg/PKG_DEL.m: modified * etc/octave-pkg/pre_install.m: deleted * etc/octave-pkg/post_install.m: new script * stk_init.m: modified Reorganize the MOLE. * misc/mole/PKG_ADD.m: Renamed to init.m * misc/mole/init.m: Renamed from PKG_ADD.m. Add variables MOLE_DO_ADDPATH and MOLE_PRUNE_ADDPATH to control the behaviour of the script. * misc/mole/PKG_DEL.m: Remove (was not needed after all). * etc/octave-pkg/pre_install.m: Call init.m (renamed from PKG_ADD.m) with MOLE_DO_ADDPATH = false and MOLE_PRUNE_ADDPATH = true. Remove call to PKG_DEL.m (was not needed, after all). * misc/mole/README: Bring up to date with the new organization of the MOLE. * misc/mole/common/isoctave.m: Moved to ../isoctave. * misc/mole/isoctave/isoctave.m: Moved from ../common. * misc/mole/install_mole_function.m: Helper function for init.m. * stk_init.m: Modified (call init.m instead of PKG_ADD.m). 2014-02-25 Julien Bect Get rid of ismatlab (). Just use ~ isoctave () instead. * config/stk_config_setup.m: Replace ismatlab -> ~isoctave. * misc/mole/common/ismatlab.m: Removed. Rename graphicstoolkit to stk_config_graphicstoolkit. * misc/mole/common/graphicstoolkit.m: removed * config/stk_config_graphicstoolkit.m: new function (formerly known as graphicstoolkit) * examples/03_miscellaneous/stk_example_misc02.m: modified Rename commonsize () to stk_commonsize (). * misc/mole/common/commonsize.m: renamed to... * utils/arrays/generic/stk_commonsize.m: ...this * misc/distrib/distrib_normal_cdf.m: modified * misc/distrib/distrib_normal_ei.m: modified * misc/distrib/distrib_normal_pdf.m: modified * misc/distrib/distrib_student_cdf.m: modified * misc/distrib/distrib_student_ei.m: modified * misc/distrib/distrib_student_pdf.m: modified * misc/mole/README: modified doc: update some help texts (script names have changed) * paramestim/stk_param_estim.m: fix doc * utils/stk_conditioning.m: fix doc * utils/stk_generate_samplepaths.m: fix doc 2014-02-24 Julien Bect Rewrite Octave packaging script in Octave (instead of Python). * admin/make_octave_package.m: Translation to the Octave langage of make_octave_package.py . Version number now properly set in DESCRIPTION based on the one returned by stk_version (). * admin/make_octave_package.py: deleted Try to solve the problem with MEX-files in private directories. * stk_init.m: Build the MEX-files *before* adding STK's subdirectories to the path. Finger crossed. * stk_build.m: Don't test if MEX-files located in private directories are found (not at this point). * config/stk_config_testprivatemex.m: New function to test if MEX-files located in private directories are found. Add load/unload scripts for the MOLE. * misc/mole/PKG_ADD.m: New initialization script, that adds selected subdirectories of the MOLE to the path. * misc/mole/PKG_DEL.m: Remove MOLE subdirectories from the path. * config/stk_config_path.m: Remove the part that is now handled by the new script (misc/mole/PKG_ADD.m). * etc/octave-pkg/pre_install.m: Run misc/mole/PKG_ADD.m first and PKG_DEL.m at the end (otherwise the load path would contain deleted temp directories after the installation). * stk_init.m: Run misc/mole/PKG_ADD.m first. 2014-02-22 Julien Bect Rewrite stk_config_rmpath without a call to stk_config_path. * config/stk_config_rmpath.m: Rewrite without a call to stk_config_path, in prevision of forthcoming changes. Rewrite stk_config_addpath in a cleaner way. * config/stk_config_addpath.m: Rewrite the function in a cleaner way, without the useless output argument. * config/stk_config_getroot.m: Add an additional output argument, to indicate if STK is present in the path. 2014-02-18 Julien Bect stk_param_getdefaultbounds.m: Handle Gaussian covariance functions. * paramestim/stk_param_getdefaultbounds.m: Handle the case of Gaussian isotropic and anisotropic covariance functions. 2014-02-17 Julien Bect Improve stk_config_getroot. * config/stk_config_getroot.m: Make it work even if STK has not been added to the search path. 2014-02-16 Julien Bect stk_sampling_maximinlhs.m: minor change * stk_sampling_maximinlhs.m (lhsdesign_): No need to check if x is empty since we start the loop at j == 2, now. 2014-02-12 Julien Bect stk_sampling_maximinlhs.m: Do not compute the criterion if niter == 1. * stk_sampling_maximinlhs.m: modified @stk_kreq_qr: heuristic improvement of numerical conditioning. * core/@stk_kreq_qr/private: new folder * core/@stk_kreq_qr/private/compute_P_scaling.m: new function * core/@stk_kreq_qr/stk_update.m: modified * core/@stk_kreq_qr/stk_kreq_qr.m: modified * core/@stk_kreq_qr/stk_set_righthandside.m: modified 2014-02-05 Julien Bect stk_testfun_braninhoo.m: Fix domain bound in the documentation. * examples/test_functions/stk_testfun_braninhoo.m: Fix domain bound in the documentation. 2014-01-17 Julien Bect Fix a bug in stk_param_init. * paramestim/stk_param_init.m: modified 2014-01-16 Julien Bect Add size checks to several functions. * core/stk_predict.m: modified * paramestim/stk_param_init.m: modified * paramestim/stk_param_estim.m: modified 2014-01-15 Julien Bect Warn Octave users about the problem with MEX-files in privates folders. * stk_build.m: modified 2014-01-10 Julien Bect First draft for the automatic generation of an Octave package. * admin/make_octave_package.py: new script * etc/octave-pkg: new folder * etc/octave-pkg/pre_install.m: new function * etc/octave-pkg/PKG_DEL.m: new function * etc/octave-pkg/PKG_ADD.m: new function Create a misc folder for optimization related functions. * misc/optim: new folder * config/stk_select_optimizer.m: moved to misc/optim * config/stk_config_addpath.m: modified Rename stk_configure -> stk_config_setup * misc/stk_configure.m: renamed * misc/stk_config_setup.m: formerly known as stk_configure.m Move 'config' up one level and rewrite part of the configuration system. * config: formerly known as misc/config * config/stk_configure.m: new function * config/stk_config_addpath.m: replacement for stk_set_root.m * config/stk_config_getroot.m: replacement for stk_get_root.m * config/stk_config_path.m: replacement for stk_path.m * config/stk_config_rmpath.m: new function * misc/config: moved to config * misc/config/stk_set_root.m: moved/renamed/modified * misc/config/stk_get_root.m: moved/renamed/modified * misc/config/stk_path.m: moved/renamed/modified * misc/config/stk_configure_octave.m: moved/modified * misc/config/stk_version.m: moved/modified * misc/config/stk_configure_matlab.m: removed/merged in stk_configure * misc/config/stk_configure_octave.m: removed/merged in stk_configure * misc/config/stk_select_optimizer.m: moved * stk_init.m: modified * stk_build.m: modified * misc/test/stk_runexamples.m: modified * misc/test/stk_runtests.m: modified * misc/mole/matlab/page_screen_output.m: new function * admin/stk_make_htmldoc.m: modified Rename stk_compile_all -> stk_build. * config/stk_compile_all.m: moved/renamed * stk_build: formerly known as stk_compile_all.m Rename stk_is_fmincon_available -> stk_optim_hasfmincon. * misc/config/stk_is_fmincon_available.m: moved/renamed * misc/optim/stk_optim_hasfmincon.m: formerly known as stk_is_fmincon_available.m Rename stk_is_pct_installed -> stk_parallel_haspct. * misc/config/stk_is_pct_installed.m: moved/renamed * misc/parallel/stk_parallel_haspct.m: formerly known as stk_is_pct_installed.m Remove obsolete function stk_is_octave_in_use. * misc/config/stk_is_octave_in_use.m: deleted 2014-01-01 Julien Bect stk_init: move some Matlab-specific configuration to a dedicated function. * misc/config/stk_octave_config.m: renamed to stk_configure_octave * misc/config/stk_configure_octave.m: formerly known as stk_octave_config * misc/config/stk_configure_matlab.m: new function * stk_init.m: modified 2013-12-19 Julien Bect Minimalist support for linear indexing on dataframes. * utils/arrays/@stk_dataframe/subsref.m: modified * utils/arrays/@stk_dataframe/subsasgn.m: modified * examples/02_design_of_experiments/stk_example_doe03.m: modified Overload reshape for stk_dataframe objects. * utils/arrays/@stk_dataframe/reshape.m: new function Set row names on the output of stk_generate_samplepaths. * utils/stk_generate_samplepaths.m: modified 2013-12-06 Julien Bect Thicker lines in examples kb01 and kb02. * examples/01_kriging_basics/stk_example_kb01.m: modified * examples/01_kriging_basics/stk_example_kb02.m: modified Improve the robustness of @stk_dataframe/set.m. * utils/arrays/@stk_dataframe/subsasgn.m: modified * utils/arrays/@stk_dataframe/set.m: modified Change the behaviour of dataframes without row or column names. * misc/config/stk_compile_all.m: modified * utils/arrays/@stk_dataframe/private/make_numeric_rownames.c: removed * utils/arrays/@stk_dataframe/subsasgn.m: modified * utils/arrays/@stk_dataframe/subsref.m: modified * utils/arrays/generic/stk_sprintf_data.m: modified 2013-12-05 Julien Bect Make stk_dataframe row manipulations faster. * utils/arrays/@stk_dataframe/private/make_numeric_rownames.c: new * utils/arrays/@stk_dataframe/subsref.m: modified * utils/arrays/@stk_dataframe/subsasgn.m: modified * misc/config/stk_compile_all.m: modified * misc/include/stk_mex.h: modified Handle infinities in stk_sprintf_colvect_* functions. * misc/text/stk_sprintf_colvect_fixedpoint.m: modified * misc/text/stk_sprintf_colvect_scientific.m: modified Add an optional max_width argument to @stk_dataframe/disp. * utils/arrays/@stk_dataframe/disp.m: modified 2013-12-03 Julien Bect Fix @stk_kreq_qr/stk_update. Add tests. * core/@stk_kreq_qr/stk_kreq_qr.m: modified * core/@stk_kreq_qr/stk_update.m: modified * misc/test/stk_isequal_tolabs.m: modified 2013-12-02 Julien Bect Remove residual occurences of stk_kriging_equations. * core/@stk_kreq_qr/stk_update.m: modified * misc/benchmarks/stk_benchmark_logdet.m: modified Advertise the mailing-list and the ticket manager on Sourceforge. * stk_init.m: modified * README: modified 2013-12-01 Julien Bect Reorganize the MOLE. Add linsolve only if necessary. * misc/mole/octave: removed * misc/mole/octave/linsolve.m: moved to misc/mole/linsolve * misc/mole/linsolve: new folder * misc/mole/linsolve/linsvoled.m: moved from misc/mole/octave * misc/config/stk_path.m: modified * misc/config/stk_set_root.m: modified Overload isequal for Octave 3.2.4 support. * utils/arrays/@stk_dataframe/isequal.m: new function * core/@stk_kreq_qr/isequal.m: new function * etc/CODING_GUIDELINES: modified 2013-11-30 Julien Bect Fix a bug in stk_octave_config. * misc/config/stk_octave_config.m: modified Reorganize the MOLE for the sake of flexibility. * misc/mole/corr: new folder * misc/mole/corr/corr.m: moved from misc/mole/matlab/stats * misc/mole/quantile: new folder * misc/mole/quantile/quantile.m: moved from misc/mole/matlab/stat * misc/mole/matlab/stats: removed * misc/mole/matlab/stats/quantile.m: moved to misc/mole/quantile * misc/mole/matlab/stats/corr.m: moved to misc/mole/corr * misc/config/stk_path.m: modified 2013-11-29 Julien Bect Add a new function to the MOLE: corr. * misc/mole/matlab/stats/corr.m: new function Move octave_quantile to the MOLE. * misc/stats: removed * misc/stats/octave_quantile.m: removed * misc/mole/matlab/stats: new directory * misc/mole/matlab/stats/quantile.m: formerly known as misc/stats/octave_quantile * utils/arrays/@stk_dataframe/quantile.m: modified * misc/config/stk_path.m: modified Make stk_runexamples fail if at least one example failed. * trunk/misc/test/stk_runexamples.m: modified 2013-11-28 Julien Bect Add a new MOLE function: graphicstoolkit. * misc/mole/matlab/graphics_toolkit.m: removed * misc/mole/common/graphicstoolkit.m: new function * examples/03_miscellaneous/stk_example_misc02: modified 2013-11-25 Julien Bect Use a more conservative form of subplot (without options). * misc/plot/stk_subplot.m: modified Fix a bug in stk_path. * misc/config/stk_path.m: modified 2013-11-24 Julien Bect Fix a typo (missing parenthesis) in stk_rescale. * utils/arrays/generic/stk_rescale.m: modified Fix a copy-paste typo in stk_path. * misc/config/stk_path.m: modified Increase test tolerance. * misc/distrib/distrib_student_cdf.m: modified Provide a replacement for graphics_toolkit in Matlab. * misc/mole/matlab/graphics_toolkit.m: modified Remove the legend in example 'misc02' if using gnuplot. * examples/03_miscellaneous/stk_example_misc02.m: modified Choose a slightly less singular example for 'doe03'. * examples/02_design_of_experiments/stk_example_doe03.m: modified Fix stk_select_optimizer: sqp is in Octave core. * misc/config/stk_select_optimizer.m: modified Add documentation for stk_select_optimizer. * misc/config/stk_select_optimizer.m: modified 2013-11-22 Julien Bect Add a new example. * examples/01_kriging_basics/stk_example_kb07.m: new script 2013-11-19 Julien Bect Change plot options in example 'doe01'. * examples/02_design_of_experiments/stk_example_doe01.m: modified Add a smoke test of all examples. * misc/test/stk_runexamples.m: modified 2013-11-18 Julien Bect Remove TRUE_NOISE_STD in example 'kb03'. * examples/01_kriging_basics/stk_example_kb03.m: modified Use the variance returned by stk_param_init for noiseless data. * examples/01_kriging_basics/stk_example_kb02.m: modified * examples/01_kriging_basics/stk_example_kb03.m: modified 2013-11-15 Julien Bect Remove stk_plot1dsim. * misc/plot/stk_plot1dsim.m: removed * misc/plot/stk_plot1d.m: modified * examples/01_kriging_basics/stk_example_kb05.m: modified 2013-11-14 Julien Bect Rewrite one-line descriptions of all examples. * examples/01_kriging_basics/stk_example_kb01.m: modified * examples/01_kriging_basics/stk_example_kb02.m: modified * examples/01_kriging_basics/stk_example_kb03.m: modified * examples/01_kriging_basics/stk_example_kb04.m: modified * examples/01_kriging_basics/stk_example_kb05.m: modified * examples/01_kriging_basics/stk_example_kb06.m: modified * examples/02_design_of_experiments/stk_example_doe01.m: modified * examples/02_design_of_experiments/stk_example_doe02.m: modified * examples/02_design_of_experiments/stk_example_doe03.m: modified * examples/03_miscellaneous/stk_example_misc01.m: modified * examples/03_miscellaneous/stk_example_misc02.m: modified Rewrite the description of example 'kb02'. * examples/01_kriging_basics/stk_example_kb02.m: modified 2013-11-12 Julien Bect Rewrite the description of example 'misc02'. * examples/03_miscellaneous/stk_example_misc02.m: modified 2013-11-11 Julien Bect New functions: stk_axes, stk_subplot, stk_title. * misc/plot/stk_subplot.m: new function * misc/plot/stk_axes.m: new function * misc/plot/stk_title.m: new function * misc/options/stk_options_set.m: modified * misc/plot/stk_figure.m: modified * examples/01_kriging_basics/stk_example_kb01.m: modified * examples/01_kriging_basics/stk_example_kb02.m: modified * examples/01_kriging_basics/stk_example_kb03.m: modified * examples/01_kriging_basics/stk_example_kb04.m: modified * examples/01_kriging_basics/stk_example_kb05.m: modified * examples/01_kriging_basics/stk_example_kb06.m: modified * examples/02_design_of_experiments/stk_example_doe01.m: modified * examples/02_design_of_experiments/stk_example_doe02.m: modified * examples/02_design_of_experiments/stk_example_doe03.m: modified * examples/03_miscellaneous/stk_example_misc01.m: modified * examples/03_miscellaneous/stk_example_misc02.m: modified 2013-11-10 Julien Bect Change plot labels in several examples. * examples/01_kriging_basics/stk_example_kb01.m: modified * examples/01_kriging_basics/stk_example_kb02.m: modified * examples/01_kriging_basics/stk_example_kb04.m: modified * examples/01_kriging_basics/stk_example_kb05.m: modified New functions to create labels with options. * misc/plot/stk_xlabel.m: new function * misc/plot/stk_ylabel.m: new function * misc/plot/stk_labels.m: new function * examples/01_kriging_basics/stk_example_kb01.m: modified * examples/01_kriging_basics/stk_example_kb02.m: modified * examples/01_kriging_basics/stk_example_kb04.m: modified * examples/01_kriging_basics/stk_example_kb05.m: modified * examples/02_design_of_experiments/stk_example_doe03.m: modified * examples/03_miscellaneous/stk_example_misc01.m: modified * examples/03_miscellaneous/stk_example_misc02.m: modified * misc/benchmarks/stk_benchmark_cov2.m: modified * misc/plot/stk_figure.m: modified * misc/plot/stk_plot2d.m: modified * misc/options/stk_options_set.m: modified * utils/arrays/@stk_dataframe/plot.m: modified 2013-11-07 Julien Bect New function to create figures for the examples. * misc/plot/stk_figure.m: new function * misc/options/stk_options_set.m: modified * examples/01_kriging_basics/stk_example_kb01.m: modified * examples/01_kriging_basics/stk_example_kb02.m: modified * examples/01_kriging_basics/stk_example_kb03.m: modified * examples/01_kriging_basics/stk_example_kb04.m: modified * examples/01_kriging_basics/stk_example_kb05.m: modified * examples/01_kriging_basics/stk_example_kb06.m: modified * examples/02_design_of_experiments/stk_example_doe01.m: modified * examples/02_design_of_experiments/stk_example_doe02.m: modified * examples/02_design_of_experiments/stk_example_doe03.m: modified * examples/03_miscellaneous/stk_example_misc02.m: modified * examples/03_miscellaneous/stk_example_misc01.m: modified * misc/benchmarks/stk_benchmark_cov2.m: modified Plot directly on the current axes. * misc/plot/stk_plot1d.m: modified * misc/plot/stk_plot1dsim.m: modified Minor changes in stk_plot1dsim. * misc/plot/stk_plot1dsim.m: modified Add figures in example kb05. * examples/01_kriging_basics/stk_example_kb05.m: modified 2013-11-02 Julien Bect Remove example misc01, rename misc02 and misc03. * stk_example_misc01.m: deleted * stk_example_misc02.m: renamed to misc01 * stk_example_misc03.m: renamed to misc02 Add a new example. * examples/01_kriging_basics/stk_example_kb06.m: new script Raise current axis to the top layer in stk_plot_shadedci. * misc/plot/stk_plot_shadedci.m: modified Add the Gaussian correlation to example 'misc02'. * examples/03_miscellaneous/stk_example_misc02.m: modified 2013-11-01 Julien Bect Add Gaussian isotropic and anisotropic covariance functions. * covfcs/stk_gausscov_iso.m: new function * covfcs/stk_gausscov_aniso.m: new function * utils/stk_model.m: modified Add the Gaussian correlation function. * misc/specfun/stk_sf_gausscorr.m: new function Improve the precision of stk_sf_matern around 0 for high nu. * misc/specfun/stk_sf_matern.m: modified 2013-10-29 Julien Bect Remove obsolete references to example01.m * core/stk_predict.m: modified * misc/plot/stk_plot1d.m: modified * examples/01_kriging_basics/stk_example_kb04.m: modified * examples/03_miscellaneous/stk_example_misc01.m: modified 2013-10-28 Julien Bect Rewrite the description of examples 'doe02' and 'doe03'. * examples/02_design_of_experiments/stk_example_doe02.m: modified * examples/02_design_of_experiments/stk_example_doe03.m: modified 2013-10-26 Julien Bect Rewrite example 'doe01'. * examples/02_design_of_experiments/stk_example_doe01.m: modified Add an optional 'box' argument to stk_sampling_halton_rr2. * sampling/stk_sampling_halton_rr2.m: modified Rewrite the description of examples 'kb04' and 'kb05'. * examples/01_kriging_basics/stk_example_kb04.m: modified * examples/01_kriging_basics/stk_example_kb05.m: modified 2013-10-23 Julien Bect Rewrite the description of example 'kb03'. * examples/01_kriging_basics/stk_example_kb03.m: modified 2013-10-20 Julien Bect Fix a bug in stk_predict and add a test. * core/stk_predict.m: modified 2013-10-16 Julien Bect Rewrite the description of example 'kb02'. * examples/01_kriging_basics/stk_example_kb02.m: modified 2013-10-15 Julien Bect Rewrite the description of example 'kb01'. * examples/01_kriging_basics/stk_example_kb01.m: modified Insert an empty line before the example header. * misc/text/stk_disp_examplewelcome.m: modified 2013-10-13 Julien Bect New example script: 1D Bayesian optimization. * examples/02_design_of_experiments/stk_example_doe03.m: new script Display help text when running an example script. * misc/text/stk_disp_examplewelcome.m: modified Restore output verbosity at the end of example scripts. * examples/01_kriging_basics/stk_example_kb01.m: modified * examples/01_kriging_basics/stk_example_kb02.m: modified Use input row names for the output of stk_feval. * utils/stk_feval.m: modified Fix a bug in @stk_dataframe/subsref. * utils/arrays/@stk_dataframe/subsref.m: modified 2013-10-12 Julien Bect Fix a bug in stk_dataframe.m and add a copy constructor. * utils/arrays/@stk_dataframe/stk_dataframe.m: modified Provide Gaussian and Student EI functions. * misc/distrib/distrib_student_ei.m: new function * misc/distrib/distrib_normal_ei.m: new function 2013-10-10 Julien Bect distrib_normal_*: return nan for negative standard deviations. * misc/distrib/distrib_normal_pdf.m: modified * misc/distrib/distrib_normal_cdf.m: modified 2013-10-09 Julien Bect Provide a first set of pdf/cdf replacement functions. * misc/distrib: new folder * misc/distrib/README: new text file * misc/distrib/distrib_student_pdf.m: new function * misc/distrib/distrib_normal_pdf.m: new function * misc/distrib/distrib_student_cdf.m: new function * misc/distrib/distrib_normal_cdf.m: new function * misc/config/stk_path.m: modified 2013-10-07 Julien Bect Make commonsize work directly on cell arrays when nargin == 1. * misc/mole/common/commonsize.m: modified 2013-09-27 Julien Bect Make Matlab/Octave compatibility easier to achieve. * misc/mole: new folder * misc/mole/README: new text file * misc/mole/common: new folder * misc/mole/common/commonsize.m: new function * misc/mole/common/ismatlab.m: new function * misc/mole/common/isoctave.m: new function * misc/mole/matlab: new folder * misc/mole/matlab/file_in_path.m: moved form misc/matlab * misc/mole/matlab/file_in_loadpath.m: moved form misc/matlab * misc/mole/matlab/stdout.m: moved form misc/matlab * misc/mole/matlab/index.m: moved form misc/matlab * misc/mole/matlab/fflush.m: moved form misc/matlab * misc/matlab: deleted * misc/mole/octave: new folder * misc/mole/octave/linsolve.m: new function * stk_init.m: modified * admin/stk_make_htmldoc.m: modified * core/@stk_kreq_qr/linsolve.m: modified * misc/test/stk_test.m: modified * misc/test/stk_runscript.m: modified * misc/config/stk_select_optimizer.m: modified * misc/config/stk_path.m: modified * misc/config/stk_octave_config.m: modified * misc/config/stk_is_octave_in_use.m: modified 2013-09-19 Julien Bect Fix a bug in stk_predict. * core/stk_predict.m: modified 2013-09-18 Julien Bect Fix a bug in stk_sampling_olhs. * sampling/stk_sampling_olhs.m: modified Add new criterions for the design of computer experiments. * misc/design: new folder * misc/design/stk_phipcrit.m: new function * misc/design/stk_maxabscorr.m: new function * misc/config/stk_path.m: modified 2013-09-13 Julien Bect New approach for the encapsulation of QR-based kriging computations. * core/@stk_kriging_equation: removed * core/@stk_kreq_qr: new class * core/stk_predict.m: modified 2013-09-13 Emmanuel Vazquez Switch to verbose display mode for examples kb01 and kb02. * examples/01_kriging_basics/stk_example_kb01.m: modified * examples/01_kriging_basics/stk_example_kb02.m: modified 2013-09-12 Julien Bect Control the verbosity of display for dataframe objects. * misc/options/stk_options_set.m: modified * utils/arrays/@stk_factorialdesign/disp.m: modified * utils/arrays/@stk_dataframe/disp.m: modified * utils/arrays/@stk_dataframe/display.m: modified * stk_init.m: modified Display row and column names between simple quotes. * utils/arrays/@stk_dataframe/stk_sprintf_colnames.m: modified * utils/arrays/@stk_dataframe/stk_sprintf_rownames.m: modified stk_param_estim.m: Fix a stupid bug. * paramestim/stk_param_estim.m: modified Reorganize folders. * utils/arrays: new folder * utils/arrays/generic: new folder * utils/@stk_dataframe: moved to utils/arrays * utils/@stk_factorialdesign: moved to utils/arrays * utils/@struct: moved to utils/arrays * misc/text/stk_sprintf_data.m: moved to utils/arrays/generic * misc/text/stk_sprintf_rownames.m: moved to utils/arrays/generic * misc/text/stk_sprintf_info.m: moved to utils/arrays/generic * misc/text/stk_sprintf_sizetype.m: moved to utils/arrays/generic * misc/text/stk_sprintf_colnames.m: moved to utils/arrays/generic * utils/stk_rescale.m: moved to utils/arrays/generic * utils/stk_normalize.m: moved to utils/arrays/generic * misc/config/stk_path.m: modified * misc/config/stk_compile_all.m: modified Fill .info field after the construction of a dataframe. * core/stk_predict.m: modified * core/@stk_kriging_equation/stk_predict.m: modified * utils/stk_feval.m: modified * sampling/stk_sampling_olhs.m: modified * sampling/stk_sampling_randunif.m: modified * sampling/stk_sampling_maximinlhs.m: modified * sampling/stk_sampling_halton_rr2.m: modified * sampling/stk_sampling_randomlhs.m: modified 2013-09-11 Julien Bect @stk_dataframe, @stk_factorialdesign: Improve display. * utils/@stk_dataframe/stk_sprintf_info.m: new function * utils/@stk_dataframe/stk_sprintf_data.m: new function * utils/@stk_dataframe/disp.m: modified * utils/@stk_dataframe/stk_sprintf_colnames.m: new function * utils/@stk_dataframe/stk_dataframe.m: modified * utils/@stk_dataframe/stk_sprintf_rownames.m: new function * utils/@stk_dataframe/stk_sprintf_sizetype.m: new function * utils/@stk_factorialdesign/disp.m: new function * utils/@stk_factorialdesign/stk_factorialdesign.m: modified * utils/@stk_factorialdesign/stk_sprintf_levels.m: new function * sampling/stk_sampling_regulargrid.m: modified * misc/text/stk_sprintf_sizetype.m: new function * misc/text/stk_sprintf_rownames.m: new function * misc/text/stk_sprintf_info.m: new function * misc/text/stk_sprintf_colnames.m: new function * misc/text/stk_sprintf_data.m: new function Allow string arguments in stk_isequal_tolabs and stk_isequal_tolrel. * misc/test/stk_isequal_tolrel.m: modified * misc/test/stk_isequal_tolabs.m: modified 2013-09-11 Emmanuel Vazquez @stk_dataframe: Increase display verbosity. * utils/@stk_dataframe/display.m: modified * utils/@stk_dataframe/disp.m: modified @stk_dataframe: Make 'data' available through get/set and dot-indexation. * utils/@stk_dataframe/private/get_column_number.c: modified stk_disp_examplewelcome.m: Define a default welcome message. * misc/text/stk_disp_examplewelcome.m: modified 2013-09-10 Julien Bect Use strtrim instead of deblank + fliplr. * misc/config/stk_version.m: modified (bugfix) * admin/m2html/m2html.m: modified * admin/m2html/private/mfileparse.m: modified Do not display Octave-style unit tests in the HTML documentation. * admin/m2html/m2html.m: modified Clarify author & copyright information in README. * README: modified 2013-09-08 Julien Bect Fix a bug with y-labels (empty legend) in @stk_dataframe/plot. * utils/@stk_dataframe/plot.m: modified Preserve row names when removing rows from a dataframe. * utils/@stk_dataframe/subsref.m: modified * utils/@stk_dataframe/subsasgn.m: modified 2013-09-07 Julien Bect Rename internal field 'vnames' to 'colnames' in @stk_dataframe. * utils/@stk_dataframe/subsasgn.m: modified * utils/@stk_dataframe/stk_dataframe.m: modified * utils/@stk_dataframe/get.m: modified * utils/@stk_dataframe/set.m: modified * utils/@stk_dataframe/disp.m: modified * utils/@stk_dataframe/bsxfun.m: modified * utils/@stk_dataframe/fieldnames.m: modified Return an stk_dataframe when using ()-indexing on an stk_dataframe. * utils/@stk_dataframe/subsref.m: modified * utils/stk_feval.m: modified * utils/@stk_dataframe/subsasgn.m: modified (nothing serious) * utils/@stk_dataframe/end.m: modified (tests) * sampling/stk_sampling_vdc_rr2.m: modified (tests) * sampling/stk_sampling_halton_rr2.m: modified (tests) 2013-09-05 Julien Bect Plot dataframes with two columns or more. * utils/@stk_dataframe/plot.m: modified 2013-09-04 Julien Bect Make @stk_dataframe behave more like matrices wrt row/column deletion. * utils/@stk_dataframe/subsasgn.m: modified Make line lengths equal in README. * README: modified 2013-09-01 Julien Bect Improve Octave 3.2.x compatibility. * utils/@stk_dataframe/max.m: modified * utils/@stk_dataframe/apply.m: modified * utils/@stk_dataframe/display.m: modified * utils/@stk_dataframe/xor.m: modified * utils/@stk_dataframe/disp.m: modified * utils/@stk_dataframe/stk_normalize.m: modified * utils/@stk_dataframe/min.m: modified * utils/@stk_factorialdesign/stk_factorialdesign.m: modified * utils/@stk_factorialdesign/stk_rescale.m: modified * utils/@stk_factorialdesign/stk_normalize.m: modified * misc/config/stk_octave_config.m: modified * misc/stats/octave_quantile.m: modified * misc/test/stk_isequal_tolabs.m: modified * misc/test/stk_test_dfbinaryop.m: modified Provide a quantile function since Matlab (base) does not have it. * misc/stats/octave_quantile.m: new function * utils/@stk_dataframe/quantile.m: modified * misc/config/stk_path.m: modified 2013-08-31 Julien Bect Add return code to several C functions. * sampling/stk_sampling_vdc_rr2.c: modified Remove unused variables in several C functions. * misc/dist/private/stk_dist_pairwise.c: modified * misc/dist/private/stk_gpquadform_pairwise.c: modified * utils/@stk_dataframe/private/get_column_number.c: modified Fix a problem with bsxfun/realpow in Matlab R2007a. * utils/@stk_dataframe/bsxfun.m: modified 2013-08-30 Julien Bect Fix several issues in stk_compile_all. * misc/config/stk_compile_all.m: modified Fix stk_octave_config to make it work in Octave 3.4.3. * misc/config/stk_octave_config.m: modified Rename stk_remlqrg to stk_param_relik. * paramestim/stk_param_relik.m: formerly known as stk_remlgrg.m * paramestim/stk_remlqrg.m: removed * paramestim/stk_param_init.m: modified * paramestim/stk_param_estim.m: modified Add new function that returns STK's version number. * misc/config/stk_version.m: new function. 2013-08-29 Julien Bect Use new covariance type 'stk_discretecov' instead of Kx_cache/Px_cache. * covfcs/stk_discretecov.m: new function. * core/@stk_kriging_equation/stk_predict.m: modified. * core/stk_ortho_func.m: modified. * core/stk_make_matcov.m: modified. * core/stk_predict.m: modified. * utils/stk_model.m: modified. Rewrite stk_noisecov for clarity. * covfcs/stk_noisecov.m: modified. 2013-08-28 Julien Bect Disable a warning in stk_predict. * stk_init.m: modified. Add checklist for creating releases. * etc/RELEASE_CHECKLIST: new text file. Add file AUTHORS (list of all contributors). * AUTHORS: new text file. Add admin script to find non-standard characters. * admin/findNonStandardCharacters: new bash script. Fix end of lines (use LF). * admin/fixEOL: new bash script to fix end of lines. * sampling/stk_sampling_vdc_rr2.c: fix EOL. * misc/dist/stk_filldist_exact.m: fix EOL. * misc/config/stk_octave_config.m: fix EOL. * misc/test/stk_runscript.m: fix EOL. 2013-08-27 Julien Bect Fix a test. * core/stk_predict.m: fix a test. 2013-08-22 Julien Bect Provide facilities for computing logdets. * core/@stk_kriging_equation/get.m: new function. * core/@stk_kriging_equation/set.m: new function. * misc/benchmarks/stk_benchmark_logdet.m: new script Prepare for future work on updating kreq objects. * core/@stk_kriging_equation/stk_update.m: new function Implement a greedy evaluation model in @stk_kriging_equation. * core/@stk_kriging_equation/stk_kriging_equation.m: modified. * core/@stk_kriging_equation/private/do_compute.m: new function. * core/@stk_kriging_equation/stk_squared_seminorm.m: new function. * core/@stk_kriging_equation/stk_predict.m: modified. * core/@stk_kriging_equation/get.m: new function. * core/@stk_kriging_equation/set.m: new function. * core/@stk_kriging_equation/linsolve.m: modified. * core/stk_predict.m: modified 2013-08-21 Julien Bect Fix horzcat/vertcat in the stk_dataframe class (Octave only). * utils/@stk_dataframe/vertcat.m: modified. * utils/@stk_dataframe/horzcat.m: modified. Rewrite get/set in the stk_dataframe class. * utils/@stk_dataframe/private/get_column_number.c: new MEX-file. * utils/@stk_dataframe/private/get_column_number.m: its brother. * utils/@stk_dataframe/get.m: new M-file. * utils/@stk_dataframe/set.m: its sister. * misc/config/stk_compile_all.m: modified. * utils/@stk_dataframe/src/get_column_number.h: removed * utils/@stk_dataframe/src/set.c: removed * utils/@stk_dataframe/src/get.c: removed * etc/CODING_GUIDELINES: Explain the rationale for this change. Fix a bug in sampling/stk_sampling_halton_rr2.m (Octave only). * sampling/stk_sampling_halton_rr2.m: modified. Get rid of a nested function in stk_compile_all.m. * misc/config/stk_compile_all.m: remove nested function. * etc/CODING_GUIDELINES: Explain the rationale for this change. Fix a bug in get_column_number.h. * utils/@stk_dataframe/src/get_column_number.h: modified. Get rid of stk_narginchk. * misc/error/stk_narginchk.m: Removed. Update argument checking in all STK functions accordingly. * etc/CODING_GUIDELINES: Explain the rationale for this change. Fix a bug in @stk_kriging_equation/stk_predict.m (nargin values). * core/@stk_kriging_equation/stk_predict.m: modified. 2013-07-22 Julien Bect Add functions to generate RR2-scrambled van der Corput and Halton sequences. Joint work with Alexandra Krauth and Elham Rahali. * sampling/stk_sampling_vdc_rr2.c: New MEX-file. * sampling/stk_sampling_vdc_rr2.m: MEX-file doc + tests. * sampling/stk_sampling_halton_rr2.m: New function. * misc/include/primes.h: New header. * misc/include/stk_mex.h: Modified. * misc/config/stk_compile_all.m: Modified. Fix a test. * core/stk_predict.m: Modified. Fix bugs in approximate comparison functions. * misc/test/stk_isequal_tolabs.m: Modified. * misc/test/stk_isequal_tolrel.m: Modified. 2013-07-18 Julien Bect Fix a minor bug in @stk_dataframe.horzcat. * utils/@stk_dataframe/horzcat.m: Modified. Benchmarks for parallelization. * misc/benchmarks: New folder. * misc/benchmarks/stk_benchmark_cov2.m: New script. * misc/benchmarks/stk_benchmark_cov1.m: New script. Rewrite parallelization of covariance evaluation. * core/private: Removed. * core/stk_make_matcov.m: Modified (much simpler now !) * misc/specfun/stk_sf_matern.m: Modified (parallelized) Add wrapper classes for parallel computation engines. * misc/parallel: New folder. * misc/parallel/@stk_parallel_engine_none: New class. * misc/parallel/@stk_parallel_engine_parfor: New class. * misc/parallel/stk_parallel_cutblocks.m: New function. * misc/parallel/stk_parallel_feval.m: New function. * misc/parallel/stk_parallel_start.m: New function. * misc/parallel/stk_parallel_engine_set.m: New function. * misc/parallel/stk_parallel_engine_get.m: New function. * misc/parallel/stk_parallel_stop.m: New function. * misc/config/stk_path.m: Modified. A new system for managing options. * misc/options: New folder. * misc/options/stk_options_set.m: New function. * misc/options/stk_options_get.m: New function. * misc/config/stk_path.m: Modified. 2013-07-15 Julien Bect Recompile a MEX-file if the source is more recent. * misc/config/stk_compile_all.m: Modified. Add MEX-file for an efficient access to the named properties of an stk_dataframe object. * utils/@stk_dataframe/src: New folder for MEX sources. * utils/@stk_dataframe/src/get.c: New method (source). * utils/@stk_dataframe/src/set.c: New method (source). * utils/@stk_dataframe/src/get_column_number.h: New C header. * misc/config/stk_compile_all.m: Compile get and set. * utils/@stk_factorialdesign/get.m: New method. * utils/@stk_factorialdesign/set.m: New method. * utils/@stk_dataframe/subsasgn.m: Use get/set. * utils/@stk_dataframe/subsref.m: Idem. * utils/@stk_dataframe/ctranspose.m: Idem. * utils/@stk_dataframe/transpose.m: Idem. * utils/@stk_factorialdesign/stk_factorialdesign.m: Idem. * utils/@stk_dataframe/stk_dataframe.m: Idem. * utils/@stk_dataframe/stk_get_rownames.m: Removed. * utils/@stk_dataframe/stk_get_colnames.m: Removed. * utils/@stk_dataframe/stk_set_rownames.m: Removed. * utils/@stk_dataframe/stk_get_colnames.m: Removed * utils/@stk_dataframe/private/get_column_indicator.m: Removed. Create a folder for common include files (*.h). * misc/include: New folder. * misc/include/stk_mex.h: Moved from misc/dist/private/. * misc/config/stk_compile_all.m: Add a -I flag for mex 2013-07-02 Julien Bect Encapsulate kriging equations in a dedicated class (bis). * core/stk_predict.m: Move the rhs loop (and a few other things) to @stk_kriging_equation.stk_predict(). Add tests. * core/@stk_kriging_equation/stk_predict.m: New function. * core/@stk_kriging_equation/linsolve.m: Cast xt to double. * core/@stk_kriging_equation/stk_kriging_equation.m: Cast xi to double. Add a third optional argument: 'xt'. 2013-06-28 Julien Bect Encapsulate kriging equations in a dedicated class. * core/@stk_kriging_equation: A new class that encapsulates the basic linear-algebraic operations related to the kriging equations. Methods: stk_kriging_equation.m, linsolve.m, stk_posterior_matcov.m and subsref.m. * core/stk_predict.m: Use the new class. 2013-06-19 Julien Bect Send a warning when negative variances are set to zero. * core/stk_predict.m: modified. 2013-06-18 Julien Bect Overloaded quantile() function for dataframe objects. * utils/@stk_dataframe/quantile.m: New function. 2013-06-16 Julien Bect Improve backward compatibility. * utils/@stk_dataframe/private/get_column_indicator.m: Return the 'var' field if it exists when 'v' is asked for, and display a warning. Fix a bug in stk_param_getdefaultbounds (not handling .a structures properly). * paramestim/stk_param_getdefaultbounds.m: Cast to double before calling var() to handle legacy .a structure properly. 2013-06-04 Julien Bect Return a dataframe from stk_conditioning(). * utils/stk_conditioning.m: Return a dataframe. Fix a bug in stk_predict (not handling .a structures properly). * core/stk_predict.m: Filter input arguments through double() to handle legacy .a structures properly. Add tests. Fix two bugs related to dataframe indexing. * utils/@stk_dataframe/private/get_column_indicator.m: Fixed. * utils/@stk_dataframe/subsref.m: Add tests. 2013-05-18 Julien Bect Use function name as variable name in stk_feval. * utils/stk_feval.m: Use function name as variable name. Get rid of local variable use_indices in stk_predict. * core/stk_predict.m: Get rid of local variable use_indices. 2013-05-09 Julien Bect Ensure that .a structures are still accepted. * utils/@struct/double.m: new overloaded function that returns the .a field of a structure, assuming it exists. * covfcs/stk_materncov32_aniso.m: add tests. 2013-04-14 Julien Bect Add two new classes: stk_dataframe, stk_factorialdesign * utils/@stk_dataframe: new class * utils/@stk_factorialdesign: new class * utils/stk_datastruct.m: removed (use overloaded double() instead) * misc/test/stk_test_dfbinaryop.m: new function to test binary operations on stk_dataframes objects * stk_sampling_regulargrid.m: modified to return an stk_factorialdesign * *.m: remove all occurences of .a, stk_datastruct, and use the new possibilities provided by the two added classes Return additional arguments from stk_rescale and stk_normalize. * utils/stk_rescale.m, utils/stk_normalize.m: modified to return additional output arguments a and b, such that y = a + b*x Reorganize exisiting text functions and add some new ones. * misc/disp/stk_disp_framedtext.m: removed, superseded by the new function stk_sprintf_framed() * misc/disp/stk_disp_examplewelcome.m: moved to misc/text * misc/text/stk_sprintf_colvect.m, stk_sprintf_colvect_fixedpoint.m, stk_sprintf_colvect_scientific.m: new functions * misc/test/stk_runexamples.m: modified * misc/config/stk_path.m: modified 2013-03-25 Julien Bect Make stk_test() silent as a grave. * misc/test/stk_test.m: Use evalc() instead of eval() to make stk_test() silent as a grave. Only works in Matlab for the time being, since evalc() is still unimplemented in Octave. 2013-03-20 Julien Bect Improve stk_runtests(). * misc/test/stk_runtests.m: Include class directories and private directories in the total number of directories. Silence warnings and display something if there were warnings during the tests. 2013-03-17 Julien Bect New function stk_param_getdefaultbounds(). * paramestim/stk_param_estim.m: Remove internal function get_default_bounds() and call stk_param_getdefaultbounds() instead. * paramestim/stk_param_getdefaultbounds.m: New function to be used instead of the internal function get_default_bounds() in stk_param_estim.m. This function can be overloaded for parameters objects. In stk_param_estim(), cast param0 to the appropriate type. * paramestim/stk_param_estim.m: Cast param0 into an object of the appropriate type and size and set model.param to the same value. Add local variables delta_p and delta_lnv in stk_remlqrg(). * paramestim/stk_remlqrg.m: Add local variables for (slightly) improved readability and efficiency. Modify stk_remlqrg() to support objects in model.param. * paramestim/stk_remlqrg.m: Ensure that param is a column vector; in the case where model.param is an object, this is actually a call to subsasgn() in disguise. 2013-03-16 Julien Bect Fix a (recently introduced...) bug in stk_param_init(). * paramestim/stk_param_init.m: Use log10() when calling logspace(). Add a non-regression test. Avoid unnecessary gradient computation in stk_param_estim(). * paramestim/stk_param_estim.m: Compute the gradient only when it is explicitely requested, both in f_() and in f_with_noise_(). 2013-03-14 Julien Bect Add a warning in stk_param_init() when lognoisevariance is defined. * paramestim/stk_param_init.m: Issue a warning if there is a non-empty lognoisevariance field, since its value won't be used. Fix other bugs in stk_param_init(). * paramestim/stk_param_init.m: Remove the second normalization that was performed in the internal function paraminit_(). Use the correct box diameter to choose the list of range values for isotropic covariance functions. 2013-03-13 Julien Bect Fix a bug in stk_param_init(). * paramestim/stk_param_init.m: Remove the value of the regularity parameter from param for stk_matercov32_iso and stk_materncov52_iso covariance functions. Avoid the use of 'stable' with unique(). * misc/dist/stk_filldist_exact.m: Avoid the use of 'stable' with unique() since Octave doesn't currently support it (and we don't really need it, anyway, or so it seems). 2013-03-12 Julien Bect Check the size of 'box' in stk_normalize. * utils/stk_normalize.m: Check the size of 'box' before using it. Raise an error if it's not [2 d]. Return empty from stk_param_estim when lnv is not estimated. * paramestim/stk_param_estim.m: Return empty for the second output argument when lognoisevariance is not estimated (to avoid warnings about output arguments not being assigned). 2013-02-27 Julien Bect Add function stk_gpquadform() to compute Gibbs-Paciorek quadratic forms. * misc/dist/stk_gpquadform.m: New function to compute Gibbs-Paciorek quadratic forms. * misc/dist/private/stk_gpquadform_pairwise.c, misc/dist/private/stk_gpquadform_matrixx.c, misc/dist/private/stk_gpquadform_matrixy.c: C sources for the fast computation of stk_quadform() in several special cases. * misc/config/stk_compile_all.m: Compile the new MEX-files. 2013-02-26 Julien Bect Prepare stk_param_estim for parameter objects (instead of vectors). * paramestim/stk_param_estim.m: Prepare for parameter objects. Rename the optimized vector for 'param' to 'u' for clarity (since it is sometimes an extended parameter vector). 2013-02-10 Julien Bect Fix and improve stk_datastruct(). * utils/stk_datastruct.m: Call inputname correctly, with an input argument. Return an empty data structure when nargin == 0. Add some tests. 2013-02-04 Julien Bect Implement the NOLHS construction of Cioppa & Luca (2007). * sampling/stk_sampling_olhs.m: The function now has an additional hidden option to trigger the construction of an extended (N)OLHS following the paper by Cioppa & Lucs (Technometrics, 2007). Fixed a bug in stk_rescale() and added regression tests. * utils/stk_rescale.m: Fixed a bug in the first part of the function (i.e., the part where the data is scaled from its original box to [0; 1]^d). Added some regression tests. 2013-01-21 Julien Bect Modified stk_set_root() to avoid the use of a persistent variable. * misc/config/stk_set_root.m: modified. The use of a persistent variable was failing to play its intended role when switching from one version of STK to another. The root folder is now detected using which('stk_test'). 2013-01-20 Julien Bect Fixed a test in stk_filldist(). * misc/dist/stk_filldist.m: modified test. Added a tolerance in a comparison; otherwise the test was failing from time to time because of numerical errors. 2013-01-19 Julien Bect Added a DoE example (sequential space-filling). * examples/02_design_of_experiments/stk_example_doe02.m: new script. Fixed a numerical issue in stk_filldist_exact(). * misc/dist/stk_filldist_exact.m: modified. Because of possible numerical inaccuracies, centers that are slightly outside the box must also be considered as candidates for being ymax. Fixed a bug in stk_filldist(). * misc/dist/stk_filldist.m: modified. Fixed a bug in the discretized case (the second output argument was the index of ymax instead of ymax itself, as advertised by the documentation). Added tests to all fill distance-related functions. * misc/dist/stk_filldist_exact.m: added tests. * misc/dist/stk_filldist_discretized.m: added tests. * misc/dist/stk_filldist.m: added tests. Added a second output argument to stk_filldist_discretized(). * misc/dist/stk_filldist_discretized.m: modified. The function now returns, as a second output argument, the point where the maximum distance is attained, as expected by stk_filldist(). 2013-01-17 Julien Bect Completed the documentation of stk_fill_dist and stk_filldist_discretized. * misc/dist/stk_filldist.m: modified (doc) * misc/dist/stk_filldist_discretized.m: modified (doc) 2013-01-14 Julien Bect Completed the documentation of stk_filldist_exact. * stk_filldist_exact.m: modified (documentation) Added a test in stk_filldist. * stk_filldist.m: modified (tests) 2013-01-13 Julien Bect Ensured that all misc/dist functions accept ".a" structures. * misc/dist/stk_dist.m: modified * misc/dist/stk_mindist.m: modified * misc/dist/stk_filldist.m: modified * misc/dist/stk_filldist_discretized.m: modified * misc/dist/private/stk_mindist.c: renamed * misc/dist/private/stk_filldist_discretized.c: renamed Moved misc/dist MEX-files into a private folder. * misc/dist/private: new folder * misc/dist/stk_dist_pairwise.c: moved to misc/dist/private * misc/dist/stk_dist_matrixx.c: idem * misc/dist/stk_dist_matrixy.c: idem * misc/dist/stk_filldist_discretized.c: idem * misc/dist/stk_mindist.c: idem * misc/dist/stk_mex.h: idem * misc/config/stk_path.m: modified * misc/config/stk_compile_all.m: modified Minor change in stk_dist (pairwise case). * misc/dist/stk_dist.m: modified 2013-01-12 Julien Bect Added a function to compute the exact fill distance, based on a paper by Luc Pronzato and Werner G. Müller (Statistics and Computing, 2011). * misc/dist/stk_filldist.m: replaced * misc/dist/stk_filldist_discretized.c: formerly stk_filldist.c * misc/dist/stk_filldist_discretized.m: formerly stk_filldist.m * misc/dist/stk_filldist_exact.m: new * misc/dist/stk_filldist.c: renamed * misc/config/stk_compile_all.m: modified =============================================== === Maintenance branch 1.2.x created here === =============================================== 2013-01-12 Julien Bect Fixed documentation. * misc/dist/stk_dist.m: modified * misc/dist/stk_mindist.m: modified * misc/dist/stk_filldist.m: modified 2013-01-03 Julien Bect Modified stk_makedoc to exclude misc/matlab from the generated HTML documentation. * stk_makedoc.m: modified Made stk_narginchk() slightly more efficient. * misc/error/stk_narginchk.m: modified Added the text of the GPLv3 license. * LICENSE: new Removed the NEWS file (to be written after creating the maintenance branch for a new release). * NEWS: removed Restored '.a' outputs for all stk_sampling_* functions and streamlined unit tests for that. * sampling/stk_sampling_olhs.m: modified * sampling/stk_sampling_randunif.m: modified * sampling/stk_sampling_regulargrid.m: modified * sampling/stk_sampling_randomlhs.m: modified * sampling/stk_sampling_maximinlhs.m: modified 2013-01-02 Julien Bect Added a script to generate the HTML documentation. * stk_makedoc.m: new script Fixed a bug in M2HTML (affecting option 'ignoredDir'). * misc/m2html/m2html.m: modified Added M2HTML version 1.5 (by Guillaume Flandin). * misc/m2html: new Removing folder ./htmldoc (to be generated after creating the maintenance branch for a new release). * htmldoc: removed 2012-12-31 Julien Bect Fixing bugs in stk_test() and stk_runtests(). * misc/test/stk_runtests.m: modified * misc/test/stk_test.m: modified 2012-12-16 Julien Bect Modified stk_runtests() to browse through private folders and class(@) folders. * misc/test/stk_runtests.m: modified Fixed a typo. * misc/test/stk_runtests.m: modified 2012-12-14 Benoit Jan Fixed a bug in stk_make_matcov's "parfor" private functions. * core/private/stk_make_matcov_inter_parfor.m: modified * core/private/stk_make_matcov_auto_parfor.m: modified 2012-12-14 Julien Bect Fixing a bug affecting stk_predict() in the 'blocked' case. * core/stk_predict.m: modified 2012-12-07 Julien Bect Minor improvement in stk_runexamples. * misc/test/stk_runexamples.m: modified 2012-12-06 Julien Bect Removed some internal ".a" fields. * core/stk_ortho_func.m: modified * core/stk_make_matcov.m: modified 2012-12-05 Julien Bect Modified stk_predict() to make it work with non-stationary covariance functions. * core/stk_predict.m: modified Added a "pairwise" option to stk_make_matcov(). * core/stk_make_matcov.m: modified 2012-12-04 Julien Bect Added a "pairwise" option to all covariance functions. * covfcs/stk_materncov*.m: modified 2012-12-02 Julien Bect Added a new MEX-file to compute distances "pairwise" (i.e., compute only the diagonal of the full distance matrix). * misc/dist/stk_distance_matrix.c: deleted * misc/dist/stk_mex.h: new C header * misc/dist/stk_dist_matrixx.c: new MEX-file * misc/dist/stk_dist_matrixy.c: new MEX-file * misc/dist/stk_dist_pairwise.c: new MEX-file * misc/config/stk_compile_all.m: modified * misc/dist/stk_mindist.c: modified * misc/dist/stk_filldist.c: modified Renamed stk_distancematrix() to stk_dist(). * misc/dist/stk_distance_matrix.m: renamed * misc/dist/stk_filldist.m: modified * covfcs/stk_materncov*.m: modified All stk_materncov* functions now also accepts simple matrix-type arguments. * covfcs/stk_materncov*.m: modified 2012-12-01 Julien Bect Fixed a typo in the documentation of stk_is_lhs(). * misc/test/stk_is_lhs.m: modified Fixed a bug in stk_runexamples(). * misc/test/stk_runexamples.m: modified 2012-11-29 Julien Bect Modified stk_predict() to return the posterior covariance matrix as a fourth output argument. * core/stk_predict.m: modified 2012-11-26 Julien Bect Modified all stk_sampling* functions to use stk_rescale() and stk_assert_box(). * sampling/stk_sampling_olhs.m: modified * sampling/stk_sampling_randunif.m: modified * sampling/stk_sampling_regulargrid.m: modified * sampling/stk_sampling_randomlhs.m: modified * sampling/stk_sampling_maximinlhs.m: modified Minor improvements in stk_is_lhs(). * misc/test/stk_is_lhs.m: modified Added a new function to rescale data from one box to another. * utils/stk_rescale.m: new function * utils/stk_normalize.m: (slightly) modified Added a new function to check "box" arguments. * misc/error/stk_assert_box.m: new function 2012-11-25 Julien Bect Added a new function to generate OLHSs, following Ye (1998). * sampling/stk_sampling_olhs.m: new function 2012-11-21 Julien Bect Added default values for some input arguments of stk_is_lhs(), and stricter dimension checking. * misc/test/stk_is_lhs.m: modified 2012-11-14 Julien Bect Changed the upper bound on nu in stk_param_estim(). * paramestim/stk_param_estim.m: modified Fixed a bug in stk_param_init(). * paramestim/stk_param_init.m: modified Added a new MEX-file to compute a discretized fill distance. * misc/dist/stk_filldist.c: new MEX-file (source) * misc/dist/stk_filldist.m: new MEX-file (doc + tests) * misc/dist/stk_mindist.m: modified * misc/config/stk_compile_all.m: modified Added a new function to help initialize stk_param_estim(). * paramestim/stk_param_init.m: new function * examples/01_kriging_basics/stk_example_kb02.m: modified * examples/01_kriging_basics/stk_example_kb03.m: modified Added a new function: stk_normalize(). * utils/stk_normalize.m: new function Renamed some internal variables in stk_param_estim(). * paramestim/stk_param_estim.m: modified 2012-11-06 Julien Bect Improved the flexibility of stk_predict() and stk_param_estim(), which are now accepting both matrices and "data structures" (with an 'a' field) as input arguments. * utils/stk_datastruct.m: new function * core/stk_predict.m: modified * paramestim/stk_param_estim.m: modified 2012-11-04 Julien Bect Improved graphical outputs in stk_example_kb03. * examples/01_kriging_basics/stk_example_kb03.m: modified Added a new function stk_plot2d() that serves has a wrapper around {surf|contour|mesh|pcolor}-type functions, to plot data defined over a two-dimensional regular grid. * misc/plot/stk_plot2d.m: new function Modified stk_predict() to avoid returning negative variances. When negative variances are encountered, they are set to zero and a warning is issued. * core/stk_predict.m: modified Modified stk_sampling_regulargrid() to return 'ndgrid-style' coordinate matrices stored in new .coord field. * sampling/stk_sampling_regulargrid.m: modified Improved Octave-specific configuration (GNUTERM=wxt). * misc/config/stk_octave_config.m: modified 2012-11-01 Julien Bect Added a new folder for test functions. * examples/test_functions: new folder * examples/test_functions/stk_testfun_braninhoo.m: new function * misc/config/stk_path.m: modified 2012-10-28 Julien Bect Improved Octave-specific configuration. * stk_init.m: modified * misc/config/stk_octave_config.m: new function * misc/config/stk_check_octave_packages.m: removed * README: modified 2012-10-24 Julien Bect Added a new example to demonstrate the effect of adding a prior on the covariance parameters. * examples/03_miscellaneous/stk_example_misc03.m: new script Added a new function to draw shaded area representing pointwise confidence intervals. * misc/plot/stk_plot_shadedci.m: new function * misc/plot/stk_plot1d.m: modified Added size checking and changed the upper bound for nu in stk_param_estim. * paramestim/stk_param_estim.m: modified Renamed "box" into "BOX" in all example scripts, to avoid conflicts with the box function. * 01_kriging_basics/stk_example_kb01.m: modified * 01_kriging_basics/stk_example_kb02.m: modified * 01_kriging_basics/stk_example_kb04.m: modified * 01_kriging_basics/stk_example_kb05.m: modified * 03_miscellaneous/stk_example_misc01.m: modified 2012-10-22 Julien Bect Improving welcome messages. * misc/disp: new folder * misc/disp/stk_disp_framedtext.m: new function * misc/disp/stk_disp_examplewelcome.m: new function * misc/config/stk_path.m: modified * examples/01_kriging_basics/stk_example_kb*.m: modified * examples/02_design_of_experiments/stk_example_doe01.m: modified * examples/03_miscellaneous/stk_example_misc*.m: modified * misc/test/stk_runexamples.m: modified Moving example scripts to subfolders. * misc/config/stk_path.m: modified * misc/test/stk_runexamples.m: new function * examples/example*.m: moved to a subfolder * examples/run_all_examples: deleted * examples/01_kriging_basics: new folder * examples/02_design_of_experiments: new folder * examples/03_miscellaneous: new folder 2012-09-26 Julien Bect Better initial guess for the log of the noise variance in example08.m (log(eps) wasn't working well with sqp()) * examples/example08.m: modified 2012-09-16 Julien Bect Fixing docs and copyright notices. * misc/dist/stk_mindist.m: doc modified * misc/dist/stk_distance_matrix.m: doc modified Fixing bugs in stk_runscript.m and run_all_examples.m * examples/run_all_examples.m: bugfix * misc/test/stk_runscript.m: bugfix 2012-09-08 Julien Bect Adding default bounds for Matérn 3/2 covariances. * paramestim/stk_param_estim.m: modified ===================== === Release 1.1 === ===================== 2012-08-28 Emmanuel Vazquez Fixing comments (5/2 -> 3/2). * covfcs/stk_materncov32_aniso.m: doc modified * covfcs/stk_materncov32_iso.m: idem Updating HTML doc. * htmldoc/*: modified 2012-08-17 Julien Bect Preparing for release 1.1: updating copyright notices and copying permission statements, removing trailing white spaces, added a user-level log of changes. * almost-all-files: doc & code formatting modified * NEWS: new file Added a new function (stk_runscript) to solve a problem of inconsistent behaviour of the run function between Matlab and the latest version of Octave (one wants a '.m', the other doesn't). * misc/test/stk_runscript.m: new function * examples/run_all_examples.m: modified Renamed README.txt to README. Added explicit version requirements for GNU Octave (3.2.0) and Matlab (R2007a). * README.txt: renamed and renamed Added tests and a little bit of arg checking. * covfcs/stk_materncov32_aniso.m: tests + arg checking * covfcs/stk_materncov32_iso.m: idem * covfcs/stk_materncov52_aniso.m: idem * covfcs/stk_materncov52_iso.m: idem * covfcs/stk_noisecov.m: idem * covfcs/stk_materncov_aniso.m: idem * covfcs/stk_materncov_iso.m: idem 2012-08-10 Julien Bect Added tests, improved documentation (help, copyright notices, ...). Added a little bit of arg checking in stk_conditioning. * utils/stk_generate_samplepaths.m: tests + doc * utils/stk_feval.m: tests + doc * utils/stk_model.m: source code formatting only * utils/stk_conditioning.m: tests + doc + arg checking * core/stk_ortho_func.m: doc * core/stk_make_matcov.m: doc * core/stk_predict.m: doc * core/private/stk_make_matcov_inter_parfor.m: doc * core/private/stk_make_matcov_auto_parfor.m: doc 2012-08-08 Julien Bect Added a new function for approximate comparisons with an absolute tolerance threshold. * misc/test/stk_isequal_tolabs.m: new function Fixed a bug in stk_isequal_tolrel (the function wasn't working as expected for non-vector arrays) and improved documentation. * misc/test/stk_isequal_tolrel.m: modified Renamed stk_conditionning to stk_conditioning. * utils/stk_conditionning.m: renamed and modified * examples/example05.m: modified accordingly 2012-08-07 Julien Bect Added tests and improved documentation. * misc/specfun/stk_sf_matern.m: tests & doc * misc/specfun/stk_sf_matern32.m: idem * misc/specfun/stk_sf_matern52.m: idem 2012-07-15 Julien Bect Replaced a call to isrow(), which didn't exist in some recent Matlab versions (e.g., R2010b), by a direct call to size(). * misc/matlab/index.m: modified 2012-07-10 Julien Bect Fixed a warning generated by stk_compile_all under Octave. * misc/config/stk_compile_all.m: modified 2012-07-08 Julien Bect Added tests and improved documentation. * sampling/stk_sampling_randunif.m: tests & doc * sampling/stk_sampling_randomlhs.m: idem * sampling/stk_sampling_regulargrid.m: idem * sampling/stk_sampling_maximinlhs.m: idem New function to test the LHS property. * misc/test/stk_is_lhs.m: new function Renamed stk_sampling_cartesiangrid to stk_sampling_regulargrid, and changed the meaning of the first argument for consistency with other stk_sampling_* functions. * sampling/stk_sampling_cartesiangrid.m: renamed and modified * examples/example01.m: modified accordingly * examples/example02.m: idem * examples/example04.m: idem * examples/example05.m: idem * examples/example06.m: idem * examples/example07.m: idem * examples/example08.m: idem * paramestim/stk_param_estim.m: idem * core/stk_predict.m: idem 2012-07-04 Julien Bect Fixed a bug in stk_compile_all() under Octave, related to a strange behaviour of exist(). * misc/config/stk_compile_all.m: bugfix. Improved doc and added tests in several functions. Also, fixed a minor bug in stk_model(). * examples/example07.m: fixed comment * utils/stk_model.m: bugfix + doc + tests * paramestim/stk_remlqrg.m: doc + tests * paramestim/stk_param_estim.m: doc + tests 2012-06-30 Julien Bect Fixed a bug in stk_runtests() under Octave. It is now possible to write "stk_runtests core" from the STK's root, for instance. * misc/test/stk_runtests.m: bugfix. Added a new function for approximate comparisons. * misc/test/stk_isequal_tolrel.m: new function. * core/stk_predict.m: modified test. Miscellaneous. * misc/error/stk_narginchk.m: fixed doc and comments. * core/stk_ortho_func.m: tests. * core/stk_make_matcov.m: idem. 2012-06-29 Julien Bect A first series of Octave-style unit tests. * core/stk_predict.m: modified * sampling/stk_sampling_maximinlhs.m: modified * misc/dist/stk_distance_matrix.m: new function * misc/dist/stk_mindist.m: new function Modified STK's path handling. A separate function stk_path() has been created, since stk_set_root() is no longer the only function that needs it. Also, several new folders have been added to the path. * misc/config/stk_set_root.m: modified * misc/config/stk_path.m: new function Imported and adapted Octave's unit testing functions. * misc/test: new folder * misc/test/stk_test.m: new function * misc/test/stk_runtests.m: new function Removed old test scripts (the tests that they contained are now included as Octave-style unit tests in the M-file themselves). * tests: deleted * tests/test_distance_matrix.m: idem * tests/test_sampling_maximinlhs.m: idem * tests/test_Kx_cache.m: idem * tests/test_mindist.m: idem Added new functions for improved error handling. * misc/error: new folder * misc/error/stk_narginchk.m: new function * misc/error/stk_error.m: new function Added new functions for improved M/O inter-operability. * misc/matlab: new folder * misc/matlab/fflush.m: new function * misc/matlab/file_in_loadpath.m: idem * misc/matlab/file_in_path.m: idem * misc/matlab/index.m: idem * misc/matlab/stdout.m: idem 2012-06-05 Emmanuel Vazquez Changed stk_param_estim to make it possible to estimate noise variance. * examples/example02.m: Bug fix * examples/example08.m: Example added about noise estimation * paramestim/stk_param_estim.m: Modified 2012-06-05 Julien Bect Fixing a bug related to the change of parameter ordering. * tests/test_Kx_cache.m: Changed the position of the 'model' parameter in several function calls. 2012-05-31 Julien Bect Reorganizing folders. * misc/dist: New folder. * misc/dist/stk_mindist.c: Moved from sampling. * misc/dist/stk_distance_matrix.c: Moved from covfcs. * misc/config/stk_set_root.m: Added misc/dist to path. * misc/config/stk_compile_all.m: Changed paths. 2012-05-30 Julien Bect Reorganizing folders. * paramestim: New folder. * paramestim/stk_param_estim.m: Moved from core. * paramestim/stk_remlqrg.m: idem. * misc: New name of the "old" utils folder. * misc/config/stk_set_root.m: Changed path. * utils: New name of the "old" utils/misc folder. * utils/stk_model.m: Moved to utils. * utils/stk_conditionning.m: idem. * utils/stk_generate_samplepaths.m: idem. * stk_init.m: Changed the location of stk_set_root. Miscellaneous changes. * sampling/stk_mindist.c: Fixed a comment. 2012-05-30 Emmanuel Vazquez * almost-all-files: Changed the order of the arguments of the functions that use the structure 'model'. Now, 'model' is always the first argument. Because of this change, it seems better to make the argument 'param' in covariance functions coming in first position too. 2012-05-19 Julien Bect Preparing headers for release 1.1. * almost-all-files: Updated headers (copyright, version). Miscellaneous changes. * core/stk_feval.m: Added optional argument 'progress_msg'. * utils/config/stk_select_optimizer.m: Minor change to avoid systematic checking of which optimizer has to be used (as shown by the comments, this was a mistake...). * examples/example07.m: Fixed doc. 2012-05-02 Julien Bect Improved compatibility with older versions of Matlab. * core/stk_param_estim: Added a try-catch block to catch "invalid parameter" errors generated by optimset(). 2012-04-22 Julien Bect Removed the undue dependency on the 'optim' package under Octave. * utils/config/stk_check_octave_packages.m: Removed dependency. Doc fixing. * README.txt: Fixed doc. * utils/config/stk_check_octave_packages.m: Fixed doc. 2012-04-21 Julien Bect Docs fixing. * core/stk_make_matcov.m: Fixed doc. * core/stk_predict.m: Fixed doc. 2012-02-21 Julien Bect Added a test for presence of GLPK in stk_check_octave_packages(). * utils/config/stk_check_octave_packages.m: Added test. * README.txt: Fixed doc. 2012-02-20 Julien Bect Fixed two bugs in run_all_examples.m. * examples/run_all_examples.m: Two bugfixes + several minor changes. The first bug was related to the try/catch block ("advanced" syntax not supported by Octave, explicitly calling lasterror() is safer). The second bug was related to the possible occurence of errors without an error identifier. Fixed a bug in stk_set_root(). * utils/config/stk_set_root.m: Fixed a bug in stk_set_root() related to the use of rmpath(). This ensures compatibility with Octave 3.0.2. 2012-02-19 Julien Bect Fixed a bug under Octave (use of Matlab-like assert statements). * covfcs/stk_noisecov.m: Replaced Matlab-style assert() statements with explicit calls to error(). Bugfix for compatibility with older versions of Octave---more precisely, of the miscellaneous package. * utils/stk_is_octave_in_use.m: Test for the existence of built-in variable OCTAVE_VERSION to check if running under Octave (instead of calling ver(), which was not working properly with some old versions of the miscellaneous package). * stk_init.m: idem. Miscellaneous changes. * sampling/stk_mindist.c: removed unused variable lambda in stk_mindist.c 2012-02-18 Julien Bect Miscellaneous changes. * tests/test_Kx_cache.m: New script. * core/stk_make_matcov.m: Simplified syntax guessing. 2012-02-17 Emmanuel Vazquez Fixed two bugs related to the use of a "covariance cache": when xi is a vector of indices, xi.a does not exist ! * core/stk_make_matcov.m: Bugfix. * core/stk_predict.m: Bugfix. Renamed fields in "model" structures (covariance_cache to Kx_cache and P0 to Px_cache). * core/stk_ortho_func.m: Renamed variables. * core/stk_make_matcov.m: idem. * core/stk_predict.m: idem. * core/stk_model.m: idem. Miscellaneous changes, mostly doc fixing. * covfcs/stk_materncov_aniso.m: Fixed doc. Renamed a variable. * covfcs/stk_materncov32_aniso.m: idem. * covfcs/stk_materncov52_aniso.m: idem. * examples/example01.m: Fixed doc (SMTK -> STK). * examples/example03.m: idem. 2012-02-12 Julien Bect Added a new function to select an appropriate optimizer in stk_param_estim(). * utils/config/stk_select_optimizer.m: New function. * core/stk_param_estim.m: Modified to use the new function. * stk_init.m: Modified to use the new function. The stk_model() function now provides default parameters for several families of covariance functions. A new field 'dim' has been added to the 'model' structure. * core/stk_model.m: Added default parameters. * examples/example*.m: Modified to use stk_model(). Miscellaneous changes. * utils/config/stk_compile_all.m: Minor change in error messages. 2012-02-11 Julien Bect The 'statistics' packages is no longer required in Octave. * README.txt: Removed dependency. * utils/config/stk_check_octave_packages.m: Removed dependency. 2012-02-08 Julien Bect New MEX-file to compute the mindist criterion. * sampling/stk_mindist.c: New MEX-file. * examples/example04.m: Removed "be patient" message. * sampling/stk_sampling_maximinlhs.m: pdist() -> stk_mindist(). * tests/test_mindist.m: New script. * tests/test_sampling_maximinlhs.m: New script. * utils/config/stk_compile_all.m: Added new MEX to be compiled. New function to generate random Latin Hypercube Samples. * sampling/stk_sampling_randomlhs.m: New function. Miscellaneous changes. * tests/test_distance_matrix.m: Added missing header. 2012-02-07 Julien Bect Improved stk_distance_matrix(). * covfcs/stk_distance_matrix.c: Added a subfunction to handle the "symmetric" case more efficiently. * tests: New directory. * tests/test_distance_matrix.m: New script. Added a 'welcome' message to the examples. * examples/example0?.m: Added a 'welcome' message. * examples/run_all_examples.m: Minor changes. * stk_init.m: Turned output pagination off and disabled verbose help messages in Octave. New covariance function (Matérn 3/2). * utils/specfun/stk_sf_matern32.m: New function. * covfcs/stk_materncov32_aniso.m: New function. * covfcs/stk_materncov32_iso.m: New function. * examples/example06.m: Added two subplots. * examples/example07.m: New script. * examples/run_all_examples.m: Increased NB_EXAMPLES. 2012-02-06 Julien Bect Fixing bugs and comments in covariance functions. * covfcs/stk_materncov52_aniso.m: Fixed a bug (an old function name was still used) and some comments. * utils/specfun/stk_sf_matern52.m: Fixed missing abs() in stk_sf_matern52(). The result was wrong for negative arguments. * covfcs/stk_materncov_aniso.m: Fixed comment. * covfcs/stk_materncov_iso.m: Fixed comment. 2012-02-05 Julien Bect New covariance function (Matérn 5/2). * utils/specfun/stk_sf_matern52.m: New function. * covfcs/stk_materncov52_aniso.m: New function. * covfcs/stk_materncov52_iso.m: New function. * core/stk_param_estim.m: Added Matérn 5/2 to get_default_bounds(). * examples/example06.m: New script. * examples/run_all_examples.m: Increased NB_EXAMPLES. Fixed issues in stk_param_estim.m related to the definition of the search domain and the selection of (constrained/unconstrained) optimizer. * core/stk_param_estim.m: Enlarged the search domain in such a way that param0 is always inside it. Changed the selection of optimizer to use fminsearch when either the upper- or the lower-bound are empty. Moved the definition of the 'options' struct to the Matlab-specific part of the code. Miscellaneous changes. * examples/example02.m: Doc & code formatting. * utils/plot/stk_plot1d.m: Added an optional argument to allow plotting on an existing axis. New directory for special functions (./utils/specfun). * utils/specfun: New directory. * utils/config/stk_set_root.m: Added ./utils/specfun to the path. * covfcs/stk_materncov_.m: Removed. * utils/specfun/stk_sf_matern.m: Replacement for stk_materncov_. * covfcs/stk_materncov_aniso.m: Modified to use stk_sf_matern. * covfcs/stk_materncov_iso.m: Modified to use stk_sf_matern. 2012-02-02 Julien Bect Miscellaneous changes. * README.txt: Improved requirements and recommendations. * core/stk_param_estim.m: Clarified selection of optimizer. Improved handling of Octave packages. * utils/stk_check_octave_packages.m: New function to check for required packages under Octave. * stk_init.m: Added a call to stk_check_octave_packages(). Removed some left-overs from an earlier version of stk_init where fminsearch() was used instead of sqp() under Octave. Moved call to stk_is_fmincon_available() to the Matlab-conditional part. Fixed a parsing problem occuring in Octave 3.4.3 (at least), related to the fact that parfor loops are supposed to end with an "endparfor" instead of a simple "end"... but we don't use "parfor" at all if we are running in Octave. * core/stk_make_matcov.m: Moved some sub-functions to independent M-files stored in a private sub-folder. * core/private: New folder. * core/private/stk_make_matcov_auto_parfor.m: New file (the code in this file was previously part of stk_make_matcov.m). * core/private/stk_make_matcov_inter_parfor.m: New file (the code in this file was previously part of stk_make_matcov.m). 2012-02-01 Julien Bect Minor bugfix + improved error message in stk_remlqrg() * core/stk_remlqrg.m: Minor bugfix: returns nan for the derivative with respect to the noise variance in the case of a model without observation noise. Improved error message if NOISEPRIOR && ~NOISYOBS (doesn't use assert anymore). * core/stk_remlqrg.m: minor bugfix + improved error message in stk_remlqrg() Added a script to run all the examples and report on errors. * examples/run_all_examples.m: new script * examples/example0*.m: remove "clear all; close all;" Improved script stk_init. * utils/config/stk_set_root.m: new function * utils/config/stk_get_root.m: new function * utils/config/stk_compile_all.m: new function * stk_init.m: Modified to use the new functions. Also, added a 'clear' statement for temporary variables STK_ROOT, fmincon_found, octave_in_use, s and ans at the end of the script. Created subdirectories in ./utils. * utils/config: new subdirectory * utils/stk_is_fmincon_available.m: moved to ./utils/config * utils/stk_is_octave_in_use.m: moved to ./utils/config * utils/stk_is_pct_installed.m: moved to ./utils/config * utils/plot: new subdirectory * utils/stk_plot1d.m: moved to ./utils/plot * utils/stk_plot1dsim.m: moved to ./utils/plot Moved stk_feval to ./core (where it should always have been). * utils/stk_feval.m: moved to ./core ===================== === Release 1.0 === ===================== 2011-09-28 Emmanuel Vazquez Initial commit of STK. stk/DESCRIPTION0000644000000000000000000000173713156161544010271 0ustar Name: STK # Version: 2.5.0 # Date: 2017-09-13 # Title: STK: A Small Toolbox for Kriging # Author: See AUTHORS.md file # Maintainer: Julien BECT and Emmanuel VAZQUEZ # Description: The STK is a (not so) Small Toolbox for Kriging. Its primary focus is on the interpolation/regression technique known as kriging, which is very closely related to Splines and Radial Basis Functions, and can be interpreted as a non-parametric Bayesian method using a Gaussian Process (GP) prior. The STK also provides tools for the sequential and non-sequential design of experiments. Even though it is, currently, mostly geared towards the Design and Analysis of Computer Experiments (DACE), the STK can be useful for other applications areas (such as Geostatistics, Machine Learning, Non-parametric Regression, etc.). # License: GPLv3+ # Url: https://sourceforge.net/projects/kriging/ # Depends: octave (>= 3.6.0) # Autoload: no stk/INDEX0000644000000000000000000005124213156161544007351 0ustar stk >> STK, a Small Toolbox for Kriging ## Copyright Notice ## ## Copyright (C) 2015-2017 CentraleSupelec ## Copyright (C) 2014 SUPELEC ## ## Author: Julien Bect ## Copying Permission Statement ## ## This file is part of ## ## STK: a Small (Matlab/Octave) Toolbox for Kriging ## (http://sourceforge.net/projects/kriging) ## ## STK 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. ## ## STK 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 STK. If not, see . ## Several reasons why we don't want to let certain functions ## appear in the INDEX (i.e., in the public API of STK) ## ## 1) Deprecation: these functions will be removed in future ## versions of STK, no need to adertise them. ## ## 2) Internal: these functions are mostly intended for internal ## use in STK. Although it might be occasionnaly useful for ## advanced users to call them directly, they are not considered ## as part of the public API and therefore not as stable as ## public API functions. Use at your own risk. ## ## 3) Trivial overload: these functions provide the same functionality ## as a corresponding "generic" function, with such a similar ## behaviour that no documentation needs to be provided. For ## instance, @stk_dataframe/abs is just a shortcut to avoid ## writing abs (double (x)) or abs (x.data) when x is an ## stk_dataframe object. No need to advertise such functions in ## the INDEX. ## ## 4) Experimental features: not ready yet for use by everyone. ## Core STK functions ## Why not group all these functions in the same folder ? ## Currently, some of them are in ./core/ and some others in ./utils/ stk_model stk_model_update stk_make_matcov stk_predict stk_predict_leaveoneout stk_pmisclass stk_conditioning stk_generate_samplepaths stk_isnoisy #stk_ortho_func [deprecated] #stk_cholcov [internal] #stk_model_fixlm [internal] Parameter estimation stk_param_estim #stk_param_getdefaultbounds [internal] stk_param_gls stk_param_init stk_param_init_lnv stk_param_relik #stk_get_optimizable_parameters #stk_set_optimizable_parameters Posterior model objects @stk_model_gpposterior/stk_model_gpposterior @stk_model_gpposterior/stk_predict @stk_model_gpposterior/stk_predict_leaveoneout @stk_model_gpposterior/stk_model_update @stk_model_gpposterior/get_input_data @stk_model_gpposterior/get_output_data @stk_model_gpposterior/get_prior_model #@stk_model_gpposterior/stk_isnoisy [overload STK] #@stk_model_gpposterior/stk_generate_samplepaths [overload STK] #@stk_model_gpposterior/stk_make_kreq [internal] #@stk_model_gpposterior/stk_predict_leaveoneout_direct [internal] #@stk_model_gpposterior/disp [overload base] #@stk_model_gpposterior/display [overload base] #@stk_model_gpposterior/fieldnames [overload base] #@stk_model_gpposterior/get [overload base] #@stk_model_gpposterior/isequal [overload base] #@stk_model_gpposterior/set [overload base] #@stk_model_gpposterior/subsasgn [overload base] #@stk_model_gpposterior/subsref [overload base] #@stk_model_gpposterior/horzcat [overload base] #@stk_model_gpposterior/vertcat [overload base] ## Prior models are currently represented by structures #@struct/get_input_data [internal] #@struct/get_output_data [internal] #@struct/get_prior_model [internal] ## The stk_kre_qr class -> not ready to be exposed #@stk_kreq_qr/disp [overload base] #@stk_kreq_qr/display [overload base] #@stk_kreq_qr/get [overload base] #@stk_kreq_qr/isequal [overload base] #@stk_kreq_qr/linsolve [overload base] #@stk_kreq_qr/subsref [overload base] #@stk_kreq_qr/stk_kreq_qr [internal] #@stk_kreq_qr/stk_set_righthandside [internal] #@stk_kreq_qr/stk_squared_seminorm [internal] #@stk_kreq_qr/stk_update [internal] Model components: Covariance functions stk_expcov_aniso stk_expcov_iso stk_gausscov_aniso stk_gausscov_iso stk_materncov32_aniso stk_materncov32_iso stk_materncov52_aniso stk_materncov52_iso stk_materncov_aniso stk_materncov_iso stk_sphcov_aniso stk_sphcov_iso stk_noisecov stk_discretecov Model components: Radial basis functions stk_rbf_exponential stk_rbf_gauss stk_rbf_matern stk_rbf_matern32 stk_rbf_matern52 stk_rbf_spherical ## Note: stk_sf_* were previously considered as experimental ## -> in principle, they can be removed at any time #stk_sf_gausscorr [deprecated] #stk_sf_matern [deprecated] #stk_sf_matern32 [deprecated] #stk_sf_matern52 [deprecated] Model components: Linear model objects @stk_lm_affine/stk_lm_affine @stk_lm_constant/stk_lm_constant @stk_lm_cubic/stk_lm_cubic @stk_lm_matrix/stk_lm_matrix @stk_lm_null/stk_lm_null @stk_lm_quadratic/stk_lm_quadratic stk_lm_polynomial #@stk_lm_affine/feval [overload base] #@stk_lm_affine/isequal [overload base] #@stk_lm_constant/feval [overload base] #@stk_lm_constant/isequal [overload base] #@stk_lm_cubic/feval [overload base] #@stk_lm_cubic/isequal [overload base] #@stk_lm_matrix/feval [overload base] #@stk_lm_matrix/isequal [overload base] #@stk_lm_null/feval [overload base] #@stk_lm_null/isequal [overload base] #@stk_lm_quadratic/feval [overload base] #@stk_lm_quadratic/isequal [overload base] Design of experiments (non-sequential): sampling stk_sampling_halton_rr2 stk_sampling_sobol stk_sampling_maximinlhs stk_sampling_nesteddesign stk_sampling_nestedlhs stk_sampling_olhs stk_sampling_randomlhs stk_sampling_randunif stk_sampling_regulargrid stk_sampling_vdc_rr2 Design of experiments (non-sequential): criterions ## note: some are in misc/design, others in misc/dist... ## Shouldn't they all be in sampling/criterions ? stk_filldist #stk_filldist_discretized [internal] #stk_filldist_exact [internal] stk_maxabscorr stk_mindist stk_phipcrit Design of experiments (sequential): criteria stk_sampcrit_ei_eval stk_sampcrit_ehvi_eval stk_sampcrit_emmi_eval stk_sampcrit_akg_eval stk_distrib_normal_ei stk_distrib_student_ei ## Design of experiments (sequential): criterion objects #@stk_function/stk_function [experimental] #@stk_function/disp [overload base] #@stk_function/display [overload base] #@stk_function/get [overload base] #@stk_function/horzcat [overload base] #@stk_function/subsasgn [overload base] #@stk_function/subsref [overload base] #@stk_function/vertcat [overload base] #@stk_function/feval [overload base] #@stk_sampcrit_ei/stk_sampcrit_ei [experimental] #@stk_sampcrit_ei/disp [overload base] #@stk_sampcrit_ei/feval [overload base] #@stk_sampcrit_ei/get [overload base] #@stk_sampcrit_ei/set [overload base] #@stk_sampcrit_eqi/stk_sampcrit_eqi [experimental] #@stk_sampcrit_eqi/disp [overload base] #@stk_sampcrit_eqi/feval [overload base] #@stk_sampcrit_eqi/get [overload base] #@stk_sampcrit_eqi/set [overload base] #@stk_sampcrit_akg/stk_sampcrit_akg [experimental] #@stk_sampcrit_akg/disp [overload base] #@stk_sampcrit_akg/feval [overload base] #@stk_sampcrit_akg/get [overload base] #@stk_sampcrit_akg/set [overload base] Examples: kriging basics stk_example_kb01 stk_example_kb01n stk_example_kb02 stk_example_kb02n stk_example_kb03 #stk_example_kb04 stk_example_kb05 stk_example_kb06 stk_example_kb07 stk_example_kb08 stk_example_kb09 stk_example_kb10 Examples: design of experiments stk_example_doe01 stk_example_doe02 stk_example_doe03 stk_example_doe04 stk_example_doe05 Examples: miscellaneous stk_example_misc01 stk_example_misc02 stk_example_misc03 stk_example_misc04 Examples: test functions, datasets, etc. stk_dataset_twobumps stk_testfun_borehole stk_testfun_braninhoo stk_testfun_goldsteinprice stk_testfun_twobumps stk_testcase_truss3 stk_testfun_truss3_bb stk_testfun_truss3_vol ## Cf. misc/distrib/README #stk_distrib_normal_cdf [internal] #stk_distrib_normal_pdf [internal] #stk_distrib_student_cdf [internal] #stk_distrib_student_pdf [internal] #stk_distrib_bivnorm_cdf [internal] Miscellaneous: arrays stk_boundingbox stk_feval stk_length stk_normalize stk_rescale @stk_dataframe/stk_dataframe @stk_factorialdesign/stk_factorialdesign @stk_factorialdesign/ndgrid @stk_hrect/stk_hrect Miscellaneous: Pareto optimality stk_dominatedhv stk_isdominated stk_paretofind Miscellaneous: Validation of models stk_distrib_normal_crps #stk_commonsize [internal] #stk_sprintf [internal] #stk_sprintf_colnames [internal] #stk_sprintf_rownames [internal] #stk_sprintf_sizetype [internal] #@stk_dataframe/stk_boundingbox [overload STK] #@stk_dataframe/stk_conditioning [overload STK] #@stk_dataframe/stk_length [overload STK] #@stk_dataframe/stk_normalize [overload STK] #@stk_dataframe/stk_rescale [overload STK] #@stk_dataframe/apply [internal] #@stk_dataframe/set_data [internal] #@stk_dataframe/stk_sprintf [internal] #@stk_dataframe/stk_sprintf_colnames [internal] #@stk_dataframe/stk_sprintf_rownames [internal] #@stk_dataframe/stk_sprintf_sizetype [internal] #@stk_dataframe/abs [overload base] #@stk_dataframe/acos [overload base] #@stk_dataframe/acosd [overload base] #@stk_dataframe/acosh [overload base] #@stk_dataframe/asin [overload base] #@stk_dataframe/asind [overload base] #@stk_dataframe/asinh [overload base] #@stk_dataframe/atan [overload base] #@stk_dataframe/atand [overload base] #@stk_dataframe/atanh [overload base] #@stk_dataframe/and [overload base] #@stk_dataframe/bsxfun [overload base] #@stk_dataframe/cat [overload base] #@stk_dataframe/cos [overload base] #@stk_dataframe/cosd [overload base] #@stk_dataframe/cosh [overload base] #@stk_dataframe/ctranspose [overload base] #@stk_dataframe/diff [overload base] #@stk_dataframe/disp [overload base] #@stk_dataframe/display [overload base] #@stk_dataframe/double [overload base] #@stk_dataframe/end [overload base] #@stk_dataframe/eq [overload base] #@stk_dataframe/exp [overload base] #@stk_dataframe/expm1 [overload base] #@stk_dataframe/fieldnames [overload base] #@stk_dataframe/find [overload base] #@stk_dataframe/ge [overload base] #@stk_dataframe/get [overload base] #@stk_dataframe/gt [overload base] #@stk_dataframe/horzcat [overload base] #@stk_dataframe/isempty [overload base] #@stk_dataframe/isequal [overload base] #@stk_dataframe/isfinite [overload base] #@stk_dataframe/isinf [overload base] #@stk_dataframe/ismember [overload base] #@stk_dataframe/isnan [overload base] #@stk_dataframe/ldivide [overload base] #@stk_dataframe/le [overload base] #@stk_dataframe/length [overload base] #@stk_dataframe/log [overload base] #@stk_dataframe/log10 [overload base] #@stk_dataframe/log1p [overload base] #@stk_dataframe/log2 [overload base] #@stk_dataframe/logical [overload base] #@stk_dataframe/lt [overload base] #@stk_dataframe/max [overload base] #@stk_dataframe/mean [overload base] #@stk_dataframe/median [overload base] #@stk_dataframe/min [overload base] #@stk_dataframe/minus [overload base] #@stk_dataframe/mode [overload base] #@stk_dataframe/mrdivide [overload base] #@stk_dataframe/mldivide [overload base] #@stk_dataframe/mtimes [overload base] #@stk_dataframe/ne [overload base] #@stk_dataframe/not [overload base] #@stk_dataframe/or [overload base] #@stk_dataframe/openvar [overload base] #@stk_dataframe/plot [overload base] #@stk_dataframe/plotmatrix [overload base] #@stk_dataframe/plus [overload base] #@stk_dataframe/power [overload base] #@stk_dataframe/prod [overload base] #@stk_dataframe/subsasgn [overload base] #@stk_dataframe/subsref [overload base] #@stk_dataframe/rdivide [overload base] #@stk_dataframe/realpow [overload base] #@stk_dataframe/reshape [overload base] #@stk_dataframe/set [overload base] #@stk_dataframe/sin [overload base] #@stk_dataframe/sind [overload base] #@stk_dataframe/sinh [overload base] #@stk_dataframe/size [overload base] #@stk_dataframe/sort [overload base] #@stk_dataframe/sqrt [overload base] #@stk_dataframe/quantile [overload base] #@stk_dataframe/std [overload base] #@stk_dataframe/sum [overload base] #@stk_dataframe/tan [overload base] #@stk_dataframe/tand [overload base] #@stk_dataframe/tanh [overload base] #@stk_dataframe/times [overload base] #@stk_dataframe/transpose [overload base] #@stk_dataframe/uminus [overload base] #@stk_dataframe/uplus [overload base] #@stk_dataframe/var [overload base] #@stk_dataframe/vertcat [overload base] #@stk_dataframe/xlim [overload base] #@stk_dataframe/xor [overload base] #@stk_dataframe/ylim [overload base] #@stk_factorialdesign/contour [overload base] #@stk_factorialdesign/fieldnames [overload base] #@stk_factorialdesign/get [overload base] #@stk_factorialdesign/isequal [overload base] #@stk_factorialdesign/ismember [overload base] #@stk_factorialdesign/mesh [overload base] #@stk_factorialdesign/meshc [overload base] #@stk_factorialdesign/meshz [overload base] #@stk_factorialdesign/pcolor [overload base] #@stk_factorialdesign/set [overload base] #@stk_factorialdesign/subsasgn [overload base] #@stk_factorialdesign/surf [overload base] #@stk_factorialdesign/uminus [overload base] #@stk_factorialdesign/stk_boundingbox [overload STK] #@stk_factorialdesign/stk_normalize [overload STK] #@stk_factorialdesign/stk_rescale [overload STK] #@stk_factorialdesign/stk_dataframe [overload STK] #@stk_factorialdesign/stk_sprintf [internal] #@stk_factorialdesign/stk_sprintf_levels [internal] #@stk_hrect/axis [overload base] #@stk_hrect/disp [overload base] #@stk_hrect/display [overload base] #@stk_hrect/get [overload base] #@stk_hrect/horzcat [overload base] #@stk_hrect/ismember [overload base] #@stk_hrect/subsasgn [overload base] #@stk_hrect/subsref [overload base] #@stk_hrect/vertcat [overload base] #@stk_hrect/stk_boundingbox [overload STK] #@stk_hrect/stk_normalize [overload STK] #@stk_hrect/stk_rescale [overload STK] #@stk_hrect/stk_dataframe [overload STK] ## Optimizers stk_minimize_boxconstrained stk_minimize_unconstrained stk_optim_isavailable @stk_optim_fmincon/stk_optim_fmincon #@stk_optim_fmincon/stk_minimize_boxconstrained [overload STK] #@stk_optim_fmincon/isequal [overload base] @stk_optim_fminsearch/stk_optim_fminsearch #@stk_optim_fminsearch/stk_minimize_unconstrained [overload STK] #@stk_optim_fminsearch/stk_minimize_boxconstrained [overload STK] #@stk_optim_fminsearch/isequal [overload base] @stk_optim_octavesqp/stk_optim_octavesqp #@stk_optim_octavesqp/stk_minimize_boxconstrained [overload STK] #@stk_optim_octavesqp/stk_minimize_unconstrained [overload STK] #@stk_optim_octavesqp/isequal [overload base] #stk_optim_testmin_box [internal] #stk_optim_testmin_unc [internal] #stk_select_optimizer [deprecated] #@stk_optim_baseclass/stk_optim_baseclass [internal] #@stk_optim_baseclass/stk_optim_isavailable [overload STK] #@stk_optim_baseclass/isequal [overload base] Miscellaneous: options, plots... stk_dist stk_halfpintl stk_init stk_options_get stk_options_set stk_plot1d #stk_plot_shadedci [internal] stk_plot_histnormres stk_plot_predvsobs stk_plot_probdom2d stk_test stk_runtests stk_version #stk_gpquadform [experimental] ## Replacement for some base functions related to figures. Mostly for use ## in STK's examples, to keep consistent graphical options accross all ## examples. No need to let these appear in the INDEX. #stk_axes [internal] #stk_figure [internal] #stk_plot_getaxesarg [internal] #stk_labels [internal] #stk_subplot [internal] #stk_title [internal] #stk_xlabel [internal] #stk_ylabel [internal] #stk_zlabel [internal] ## error/warning #stk_error [internal, not for public use] ##stk_warning does not exist yet, but it should (?) ## misc/text #stk_disp_examplewelcome [internal] #stk_disp_progress [internal] #stk_disp_isloose [internal] #stk_disp_getformat [internal] #stk_sprintf_colvect [internal] #stk_sprintf_colvect_fixedpoint [internal] #stk_sprintf_colvect_scientific [internal] #stk_sprintf_framed [internal] ## testing STK #stk_assert_box [internal] #stk_isequal_tolabs [internal] #stk_isequal_tolrel [internal] #stk_is_lhs [internal] #stk_test_class [internal] #stk_test_dfbinaryop [internal] ## (embryonic) parallelization engine #@stk_parallel_engine_none/stk_parallel_engine_none [experimental] #@stk_parallel_engine_none/stk_parallel_feval [experimental] #@stk_parallel_engine_none/stk_parallel_stop [experimental] #@stk_parallel_engine_none/isequal [overload base] #@stk_parallel_engine_parfor/stk_parallel_engine_parfor [experimental] #@stk_parallel_engine_parfor/stk_parallel_feval [experimental] #@stk_parallel_engine_parfor/stk_parallel_stop [experimental] #@stk_parallel_engine_parfor/isequal [overload base] #stk_parallel_cutblocks [experimental] #stk_parallel_engine_get [experimental] #stk_parallel_engine_set [experimental] #stk_parallel_feval [experimental] #stk_parallel_start [experimental] #stk_parallel_stop [experimental] stk/NEWS0000644000000000000000000010631313156161544007256 0ustar # Changes in version 2.5.0 ## Required Octave version * Required Octave version number has been raised to 3.6.0. ## Sequential design of experiments * `stk_sampcrit_akg_eval`: New function. Computes the Approximate Knowledge Gradient (AKG) sampling criterion. * `stk_example_doe05`: Example script that demonstrates the use of the AKG and EQI sampling criteria for noisy optimization. * New (experimental) classes to represent sampling criterion objects: `stk_sampcrit_ei`, `stk_sampcrit_akg`, `stk_sampcrit_eqi`. * `stk_sampcrit_ei_eval`: Remove deprecated calling forms. ## Design of experiments * `stk_factorialdesign`: Accept one-variable `stk_dataframe` objects as factors and preserve column names in this case. * `stk_sampling_nesteddesign`: New function to create nested designs. * `stk_sampling_nestedlhs`: New function to create nested LHS (NLHS). * `stk_sampling_sobol`: Fix help text. ## Validation of models * `stk_distrib_normal_crps`: New function to compare observations and predictive (Gaussian) density. * Calling `stk_predict_leaveoneout` with no output arguments now automatically creates two cross-validation diagnostics in two subplots: prediction VS observations (left panel) and normalized residuals (right panel). * `stk_predict_leaveoneout` uses now the virtual LOO formula. ## `stk_dataframe` and related classes * `stk_hrect`: Preserve column names for `stk_dataframe` inputs. * `@stk_dataframe/find`: Overload base function to support calling find with an stk_dataframe as first input argument. * `@stk_dataframe/plotmatrix`: Overload base function to enrich `plotmatrix` graphics with variable names when possible. * Logical functions + Operations that normally return logical (`lt`, `eq`, `and`...) now return logical values for `stk_dataframe` arguments. + New overloaded functions for `stk_dataframe` objects: `isinf`, `isnan`, `isfinite`. * Testing array membership + `@stk_dataframe/ismember`: No longer assumes `rows` flag for consistency with the base `ismember` function. + `stk_factorialdesign/ismember`: New function. Tests membership for factorial designs much more efficiently than for plain arrays or data frames. * `stk_generate_samplepaths` now returns a plain numerical array instead of a data frame. ## Miscellaneous * `stk_plot_probdom2d`: New function to represent the uncertainty about a 2D Pareto front. This function is currently considered experimental and should not be expected to produce a reliable representation of the uncertainty for difficult or high-dimensional optimization problems. * New test case: "truss3" (Koski, 1985; Das, 1997). * Many functions have been optimized for speed. * `stk_plot1d`: Handle the case where `xt` is not sorted. * Support old-style STK structures (with a `.a` field) has been removed. ----- # Changes in version 2.4.2 ## Bug fixes * Fix display problem of `stk_model_gpposterior` objects in Octave 4.2 (ticket #73). # Changes in version 2.4.1 ## Bug fixes * `stk_pmisclass`: Handle properly the case where `K22` is negative or null. * `stk_get_optimizable_parameters`, `stk_get_optimizable_parameters`: Fix syntax errors. * `stk_param_estim`: Issue a better error message when `LNV0` (the starting point for the estimation of the lognoisevariance parameter) is either `NaN` of infinite (ticket #72). ## Sampling criteria * `stk_sampcrit_ei_eval`: The function now has a new syntax. The other syntaxes, introduced (accidentally) in STK 2.4.0, will remain supported in 2.4.x, but are deprecated and will be removed in a future release. * Unlike the older `stk_distrib_normal_ei` function, `stk_sampcrit_ei_eval` is written for a *minimization* problem, following the usual convention in optimization software. * From now on, it is recommended to use `stk_sampcrit_ei_eval` instead of `stk_distrib_normal_ei`. * `stk_sampcrit_emmi_eval`: Now accepts for the input argument `ZI` a set of observations that contains dominated solutions (rows). Dominated rows and duplicates are removed automatically, as in `stk_sampcrit_ehvi_eval`. ## Documentation * `stk_pmisclass`, `stk_sampcrit_ei_eval`, `stk_sampcrit_ehvi_eval`: Help text has been added for all these functions. # Changes in version 2.4.0 ## Choosing the optimizer used in `stk_param_estim` * The choice of the optimization algorithm used in `stk_param_estim` is now much more flexible, thanks to a new interface based on "optimizer object" classes. * The following classes are currently available: `@stk_optim_octavesqp`, `@stk_optim_fmincon`, `@stk_optim_fminsearch`. * `stk_optim_octavesqp` works both in Octave and in Matlab, with two possible choices for the QP solver: `qp` (available in Octave only, this is Octave's core `qp` function) and `quadprog` (available in Matlab from the Optimization toolbox or from MOSEK; should be available in Octave's optim package soon). * Automatic detection of available optimizers. * `stk_minimize_boxconstrained` (new function): Perform box-constrained minimization of a function. This function is overloaded for each optimizer object class that supports box-constrained optimization. * `stk_minimize_unconstrained` (new function): Perform unconstrained minimization of a function. This function is overloaded for each optimizer object class that supports unconstrained optimization. ## Covariance functions * It is now possible to specify default bounds for the estimation of the parameters in a user-defined covariance function. See the documentation of `stk_param_getdefaultbounds` for more information. * Experimental/undocumented feature: it is possible to provide a specialized `stk_param_init` function for user-defined covariance functions. Read `stk_param_init` if you need to do this. (This feature might be removed or modified in future releases.) * Radial basis functions (old and new): + `stk_rbf_matern`, `stk_rbf_matern32`, `stk_rbf_matern52` and `stk_rbf_gauss` (previously available internally as `stk_sf_*` functions). + New: `stk_rbf_exponential`, `st_rbf_spherical`. + Bugfix: `stk_rbf_matern32`, `stk_rbf_matern52` return 0 for very large `h`, where `stk_sf_matern32` and `stk_sf_matern52` returned NaN. * New covariance functions + Exponential (aka Matérn 1/2): `stk_expcov_iso`, `stk_expcov_aniso` + Spherical: `stk_sphcov_iso`, `stk_sphcov_aniso` ## Linear models * `model.lm` and linear model objects (`stk_lm_*` classes), introduced as an experimental feature in STK 2.2.0, are now the recommended way of setting the linear part of Gaussian process models. * `model.order` is deprecated (but still supported). * As an example, the following define a Gaussian process with a Matérn 5/2 covariance function and a quadratic trend: model = stk_model ('stk_materncov52_aniso'); model.lm = stk_lm_quadratic; * `stk_lm_polynomial` (new function): Create a polynomial model of given degree, up to cubic models. ## `stk_model_gpposterior` objects * A new `stk_model_gpposterior` class is introduced to represent a Gaussian process conditioned by observations (which is again Gaussian process). * Internally, an `stk_model_gpposterior` object currently stores the QR factorization of the associated kriging matrix (other representations will be implemented in the future). * `stk_predict` is overloaded for `stk_model_gpposterior` objects. * `stk_model_update` (new function): Update a model with new observations. ## Space-filling designs * `stk_sampling_sobol`: New function to generate points from a Sobol sequence using the algorithm of Bratley and Fox (1988), as modified by Joe and Kuo (2003). The C implementation under the hood is due to Steven G. Johnson, and was borrowed from the NLopt toolbox (version 2.4.2). ## Sampling criterions for sequential designs * `stk_sampcrit_ei_eval` (new function): Compute the expected improvement (EI) criterion for single-objective noiseless optimization. * `stk_sampcrit_ehvi_eval` (new function): Compute the expect hyper-volume improvement (EHVI) criterion (Emmerich, Giannakoglou & Naujoks, 2006) for multi-objective noiseless optimization. This function implements an exact computation of the EHVI criterion, using a decomposition of the dominated region into hyper-rectangles. * `stk_sampcrit_emmi_eval` (new function): Compute the expected maximin improvement (EMMI) criterion for multi-objective noiseless optimization (Svenson & Santner, 2010). ## Miscellaneous * `stk_pmisclass` (new function): Compute either the current probability of misclassification or the expectation of the future probability of misclassification, with respect to a given threshold. * `stk_dominatedhv` (new function): Compute Pareto-dominated hypervolumes, which relies internally on the "Walking Fish Group" (WFG 1.10) algorithm. The function can also return the underlying inclusion-exclusion representation of the dominated region, i.e., its representation as a collection of signed overlapping hyper-rectangles. * `stk_predict_leaveoneout`: New function that computes leave-one-out predictions and residuals. * `stk_isnoisy` (new function): Returns false for a noiseless model and true otherwise. ## Graphics * All STK functions related to graphics now accept a handle to existing axes as optional first input argument, and return a handle (or a vector of handles when appropriate) to the graphical object created by the function. * STK is now compatible with Matlab >= R2014b, where handles to graphical objects are not numbers any more. * `stk_plot1d`: A nice default legend can now be created painlessly using legend ('show'), and a struct of handles to the graphical objects composing the plot is returned to facilitate further customization. See, e.g., examples 1 and 2 in the "kriging basics" series. * `stk_plot2d`: Removed (had been deprecated for a while). * `stk_plot_predvsobs` (new function): Plot predictions against observations. * `stk_plot_histnormres` (new function): Plot histogram of normalized residuals, together with the N(0, 1) pdf as a reference. ## Examples * `stk_example_doe04`: Example script that demonstrates the use of `stk_pmisclass`. * `stk_example_kb10`: Example script that demonstrates the use of leave-one-out cross-validation to produce goodness-of-fit graphical diagnostics. * `stk_testfun_borehole` (new function): New test function (the "borehole model" response function, from Harper & Gupta 1983). * `stk_testfun_twobumps` (new function): A simple 1D test function. * `stk_dataset_twobumps` (new function): Define three datasets based on the TwoBumps test function. ## stk_dataframe class * New overloaded functions for stk_dataframe objects: `acos`, `acosd`, `acosh`, `asin`, `asind`, `asinh`, `atan`, `atand`, `atanh`, `cos`, `cosd`, `cosh`, `exp`, `expm1`, `log`, `log10`, `log1p`, `log2`, `logical`, `sin`, `sind`, `sinh`, `sqrt`, `tan`, `tand`, `tanh`. * `@stk_dataframe/bsxfun`: Now preserve row names if possible. * `@stk_dataframe/openvar` (new function): Convert `stk_dataframe` object to table or double array before opening it the variable editor. * `stk_dataframe` arrays now accept characters indices (row/column names) and cell array indices (list of row/column names). * The `info` field is deprecated. ## Other minor changes * `stk_plot_shadedci`: Delete invisible area object. * `@stk_hrect/ismember`: Optimize for speed. * `stk_predict`: In the case of discrete models, row input vectors are no longer accepted. * `stk_runtests`: Now also available in the Octave package release, to provide a convenient wrapper around __run_test_suite__ (). * `stk_maxabscorr`: No longer relies on corr (). * `stk_kreq_qr`: Now has a default constructor, which allows to load saved `stk_kreq_qr` objects properly. ----- # Changes in version 2.3.4 ## Bug fixes * `@stk_hrect/ismember`: Fix + a bug that prevented `ismember` from working on more than one point at a time, and + another bug in the case where `B` is not an `stk_hrect` object (it was incorrectly assumed to be an `stk_dataframe` in this case). * `@stk_hrect/subsref`: Make sure that the returned value is still an `stk_hrect` object when the number of rows (which is two) is unchanged. ## Minor changes * Add a `clean` target to the Octave package Makefile. * Decrease unit test verbosity. # Changes in version 2.3.3 ## Bug fixes * `stk_dist`, `stk_filldist`, `stk_gpquadform`, `stk_mindist`: Fix segmentation faults occurring with very large matrices (related to signed integer-based index computation in the underlying MEX-files). * `stk_example_doe03`: Use the appropriate flag for maximization. * `mole/matlab/file_in_path.m`: Fix two bugs (Matlab only) ## Minor changes * `stk_example_doe03`: Display pointwise credible intervals in the upper panel. # Changes in version 2.3.2 ## Bug fixes * `stk_param_estim`: Fix a bug related to parameter objects. More precisely, use `(:)` indexing systematically to access the vector of numerical parameters corresponding to a given parameter object. * `@stk_kreq_qr/get`: Fix a call to `dot` to make it work when there is only one observation. * Add missing field "Depends" to the `DESCRIPTION` file in the Octave package. ## Minor changes * `stk_param_getdefaultbounds`: Return empty lower and upper bounds for parameter classes that do not implement the `stk_param_getdefaultbounds` (instead of calling `error`). * Add optional field "Autoload" to the `DESCRIPTION` file in the Octave package. # Changes in version 2.3.1 ## Bug fixes * `stk_optim_hasfmincon`: Detect `fmincon` by trying to use it, instead of relying on the result of the `exist` function (ticket #30 closed). * `stk_param_estim`: Make sure that the bounds that we use for the `lnv` parameter contain the starting point `lnv0` when it is provided. * `@stk_dataframe/set`: Fix `stk_error` calls (missing mnemonic). * `stk_distrib_bivnorm_cdf`: Fix a bug in the case of mixtures of singular and non-singular cases. * `@stk_dataframe/subsasgn`: Preserve column names when deleting rows, even if the resulting array is empty. ## Minor changes * `stk_init`: Clear persistent variables. As a consequence, `stk_init` can now be used to restart STK completely. * `stk_commonsize`: Accept empty dimensions, under the condition that all input arguments have the same empty dimensions (in which case the result is empty). * `stk_commonsize`: is now faster when some arguments already have the proper size (unnecessary calls to `repmat` are avoided). * `stk_distrib_normal_cdf`, `stk_distrib_bivnorm_cdf`: are now slightly faster (unnecessary calls to `stk_commonsize` are avoided). # Changes in version 2.3.0 ## Model structures * `lognoisevariance` is now considered a mandatory field. For backward compatibility, a missing or empty lognoisevariance field is interpreted as `-inf`. A NaN value in the lognoisevariance field is now interpreted as meaning that the variance of the noise must be estimated. * `model.param` is set to NaN by `stk_model`. This special value indicates that the parameters must be estimated from the data before any prediction can be done. * Improved documentation for `stk_model`. ## Parameter estimation * `stk_param_init` defaults to using the input value of `model.lognoisevariance` if it is not NaN, and estimating the variance if it is NaN. The meaning of the fifth argument, now called `DO_ESTIM_LNV`, has thus slightly changed: it is used to force or prevent the estimation of the variance of the noise, regardless of the value of `model.lognoisevariance`. * `stk_param_init` also supports the heteroscedastic noisy case, but only when the variance of the noise is assumed to be known. * `stk_param_init_lnv` is a new function that provides a rough estimate of the variance of the noise (in the spirit of `stk_param_init`). * `stk_param_estim` estimates the variance of the noise if either + `param0lnv` is provided and is not empty (as in STK <= 2.2.0), or + `model.lognoisevariance` is NaN (new behaviour). If `param0lnv` is not provided, a starting point is obtained using the new `stk_param_init_lnv` function. In all cases (whether `lnv` is estimated or not) a meaningful value is returned for `lnv` (equal to `model.lognoisevariance` when `lnv` is not estimated). * `stk_param_estim` can provide a value for `param0` when it is missing from the list of input arguments. * `stk_param_relik`: Compute `G = W' * K * W` in such a way that the result is always (?) symmetric. ## Prediction * `stk_predict` computes `lambda_mu` and `RS` only when necessary, depending on the number of output arguments. ## Covariance functions * `stk_noisecov` now has a `pairwise` argument, like the others. ## Sampling * `stk_sampling_randunif` accepts empty dim argument when `box` is provided ## Simulation of Gaussian process sample paths * `stk_generate_samplepaths`: Do not add observation noise to the generated sample paths. This is consistent with `stk_predict`, which returns posterior variances for the unknown function, not for future noisy observations. * `stk_conditioning`: Simulate sample paths conditioned on noisy observations when the additional `NOISE_SIM` argument is provided. * `stk_generate_samplepaths`: Fix conditioning on noisy observations, which was not implemented properly until now. * `stk_generate_samplepaths`: The output is an `stk_dataframe` object if either `MODEL.response_name` exists and is a non-empty string, or one of the input arguments (`XI`, `ZI`, `XT`) is an `stk_dataframe` object. * `stk_conditioning`: The output is an `stk_dataframe` object if either `LAMBDA` or `ZSIM` is an `stk_dataframe` object. ## Objects representing sets * `stk_hrect`: new class to describe hyper-rectangle objects. * `stk_boundingbox`: constructs the bounding box for a set of points. ## Examples * `stk_example_kb04` demonstrates how it is possible to estimate the variance of the noise without providing a initial guess for it. * `stk_example_kb09` demonstrates how to simulate conditional sample paths in the case of noisy observations, both in the homoscedastic and in the heteroscedastic cases. ## Miscellaneous * `stk_distrib_bivnorm_cdf` computes bivariate normal probabilities. * `stk_disp_progress`: New function that displays a textual progress indicator. * `stk_feval` handles cell-arrays of functions (ticket #19 closed), multivariate outputs (ticket #20 closed), and uses vectorized calls by default (unless a progress indicator is displayed). * `sort`, `mtimes`, `uplus` and `uminus` are now overloaded for `stk_dataframe` objects * `min`, `max` are now able to return a second output argument (index of mininizer or maximizer) for `stk_dataframe` arguments. * Now the output of `stk_dataframe` is always an `stk_dataframe` object. Previously, this wasn't true if the first input argument was, e.g., an `stk_factorialdesign` object. * `stk_distrib_normal_ei`, `stk_distrib_student_ei`: bugfix (the optional input argument "minimize" was not taken into account). * `stk_distrib_normal_cdf`: Fix the zero-variance case. ----- # Changes in version 2.2.1 ## Octave 4.0 compliance * Fix unit tests ## Octave package * Do not ship `stk_test` and `stk_runtests` with the Octave package # Changes in version 2.2.0 ## Octave package * The STK is now available both as an "all-purpose" Matlab/Octave toolbox (as usual) and as a full-fledged Octave package that can be installed using `pkg install`. ## Core * `stk_model` now also accepts function handles for `covariance_type`. * `stk_ortho_func` is deprecated and will be completely replaced, in the 3.x series, by linear model objects. In the meantime, `stk_ortho_func` has been kept as a gateway to `stk_lm_*` functions and now supports the case of cubic polynomial models. * `stk_cholcov`: new function that adaptively adds a little bit of noise on the diagonal of a covariance matrix to help `chol` succeed, when the first factorization returned by `chol` is not complete (a warning is emitted when doing so). Used in `stk_param_init`, `@stk_kreq_qr/get`, `stk_param_relik`... * `@stk_kreq_qr`: heuristic improvement of numerical conditioning (implemented in the new private function `compute_P_scaling`). ## Covariance functions * Accept `invRho = 0` in anisotropic covariance functions. * `stk_sf_matern`: Handle special cases (3/2, 5/2, infinity) explicitly, and handle large values of the smoothness parameter `nu` better. * Handle the case of Gaussian isotropic and anisotropic covariance functions in `stk_param_init` and `stk_param_getdefaultbounds`. ## Linear models * Introduce linear models objects. Currently, the following linear model object classes are available: `stk_lm_null`, `stk_lm_constant`, `stk_lm_affine`, `stk_lm_quadratic`, `stk_lm_cubic` and `stk_lm_matrix`. * Linear model objects are still considered an experimental feature. They can be accessed by setting `model.order` to NaN, in which case `model.lm` is expected to contain a linear model object. * `stk_example_misc03`: New example script that demonstrates the use of linear model objects. ## Sample path simulation (`stk_generate_samplepaths`) * The simulation of conditioned sample paths has been made easier (see ticket #3 on SF). This is demonstrated by `stk_example_kb08`. * Now uses `model.response_name` (if available) to create column names for the output array, and `xt.rownames` (if available) to create row names. * `stk_generate_samplepaths` can deal with replicated rows in `xt`. ## Parameter estimation * `stk_param_estim` * Warn about constant-response data. * Return an additional `info` structure, which currently contains the criterion that has been used, the criterion value at the optimum, and the bounds. * Add a new (optional) input argument that will make it possible, in the future, to select which estimation criterion to use. * `stk_param_relik` * Check symmetry of `G = W' * K * W` and apply a naive fix if it is not (emit a warning when doing so). * Improved implementation, which seems to reduce the number of warnings related to bad conditioning, and also improve the performance for large `n` (about 1000, say). * New optimization options (can bet set through `stk_options_set`) * Add global options to control upper/lower bounds for `stk_param_estim`. * (Matlab) Add a `optim_display_level` option to control the verbosity `fmincon`/`fminsearch`. Its default value is `'off'`. * `stk_param_gls`: new function that computes the GLS estimator. ## Array objects (`stk_dataframe`, `stk_factorialdesign`) * `stk_length`: New function that returns the "length" of an array, currently defined as its number of rows. * Improved display for both `stk_dataframe` and `stk_factorial` objects * Fix and improve accessors (`subsasgn`, `subsref`, `set`, `get`, `fieldnames`) * Minimalist support for linear indexing on `stk_dataframe` objects * New overloaded methods: `@stk_dataframe/abs`, `@stk_dataframe/reshape` * `@stk_dataframe/plot`: Full rewrite to improve compatibility with the base plot function. The case where `x` is an `stk_dataframe` objects with two or more columns is now handled in a way that is consistent with the base plot function (i.e., if `x` has two columns, then we get two 1D plots). * `@stk_dataframe/horzcat`, `@stk_dataframe/vertcat`: Now the result is always an `stk_dataframe` object, and has row names iff either one of the two arguments doesn't have row names, or the row names of both arguments agree. * `@stk_dataframe/bsxfun`: Modify the behaviour of `bsxfun` for `stk_dataframe` objects. The result is always an `stk_dataframe` object, and has column names iff either one of the two arguments doesn't have columns names or the columns names of both arguments agree. ## Graphics * `stk_plot2d` is deprecated and will be removed in the 3.x series. Use `contour`, `mesh`, `surf`... directly instead (they are now overloaded for `stk_factorialdesign` objects). * `stk_plot1d`: Improved flexibility in the way input arguments are handled. * `stk_figure` does not set the axis title any more. ## Pareto domination * `stk_isdominated`: New function that returns true for dominated rows. * `stk_paretofind`: New function that finds non-dominated points. * `stk_example_misc04`: New example script illustrating random Pareto fronts. ## Faster and less verbose startup * Stop bothering users at startup with information that they can find in the `README` file anyway. * Don't display selected optimizers at startup. * In Matlab, don't bother checking if the PCT is installed. ## Documentation * New HTML documentation, available in the "all-purpose" Matlab/Octave release (doc/html directory) and online on Source-Forge at . * Lots of fixes and improvements in help texts. * Add a `CITATION` file, which explains how to cite STK in publications. * `stk_testfun_braninhoo`: Fix domain bounds in the documentation. ## Miscellaneous * Options set/get * `stk_options_set`: Add a reset feature. * `stk_options_set`: Prevent persistent from being cleared (bugfix) * Remove `page_screen_output` (not needed anymore). * Restore the `stk_` prefix for `distrib_*` functions (`distrib_normal_cdf` is renamed to `stk_distrib_normal_cdf`, `distrib_student_ei` to `stk_distrib_student_ei`, etc.) * Lots of internal changes, minor changes, etc. not worth mentioning here. ----- # Changes in version 2.1.1 ## Bug fix * Fix a bug in `stk_param_init`. ## Minor changes * Add size checks to several functions. * Warn Octave users about the problem with MEX-files in privates folders: Octave must be restarted when `stk_init` is run for the first time. # Changes in version 2.1.0 ## How to get help * Several ways to get help, report bugs or ask for new features on Sourceforge are now proposed to the user (both in `README` or `stk_init.m`) ## Examples * Existing examples have been improved: descriptions rewritten; graphical options controlled globally thanks to dedicated plotting functions (`stk_figure`; `stk_subplot`, `stk_axes`, `stk_title`...); + lots of minor changes * New examples * kb06: ordinary kriging VS linear trend * kb07: simulations of Matérn sample paths with different various `nu` * doe03: one-dimensional Bayesian optimization (expected improvement) ## Covariance functions * New function: `stk_gausscov_iso` (isotropic Gaussian covariance model) * New function: `stk_gausscov_aniso` (anisotropic Gaussian covariance model) ## Special functions * The precision of `stk_sf_matern` has been improved around 0 for high `nu` * New function: `stk_sf_gausscorr` (Gaussian correlation function in 1D) ## Design of experiments * New function: `stk_phipcrit` (phi_p criterion for space-filling designs) * New function: `stk_maxabscorr` (maximal pairwise absolute correlation) ## Probability distributions * A new 'probability distributions' module has been initiated (read `misc/distrib/README` to understand the reasons why) * Currently provides: pdf, cdf and expected improvement (EI) for the Gaussian and Student t distributions ## Matlab/Octave compatibility * Matlab/Octave compatibility throughout all supported releases has been strengthened, thanks to the creation of a Matlab/Octave Language Extension (MOLE) module * octave_quantile removed; instead, a replacement for `quantile` is provided by the MOLE when needed. * new function `graphicstoolkit`, providing a kind of replacement for `graphics_toolkit`, that also work in Matlab and old Octave releases * ... ## Miscellaneous * `stk_plot1dsim` has been removed (use `stk_plot1d` instead) * plotting functions now work directly on the current axes * An optional `box` argument has been added to `stk_sampling_halton_rr2` * `stk_feval` now uses input row names for its output ## Bugfixes * `@stk_kreq_qr/stk_update` is now (inefficient but) working * `isequal` is now working for `stk_dataframe` and `stk_kreq_qr` objects in Octave 3.2.x (explicit overloading was required for these old releases) * and many other tiny little things ----- # Changes in version 2.0.3 ## Bug fix * Fix a bug `core/stk_predict.m` (related to blockwise computations) # Changes in version 2.0.2 ## Bug fixes * Fix a bug in `@stk_dataframe/subsref` (handle colnames properly when ()-indexing is used to extract a subset of rows). * Fix a bug in `@stk_dataframe/stk_dataframe` (make sure that `.data` contains numerical data) and add a copy constructor. # Changes in version 2.0.1 ## Bug fixes * Fix a bug in `stk_predict` (don't compute the optional outputs `lambda` and `mu` when they are not requested by the caller). * Fix a bug in `stk_sampling_olhs` (fail neatly when called with n = 2). # Changes in version 2.0.0 ## Required Octave version number * Required Octave version number has been raised to 3.2.2. ## Important changes to the public API * New R-like data structures: `@stk_dataframe`, `@stk_factorial_design`. * The structures previously used everywhere in STK (with a `.a` field) are still supported but should be considered as deprecated (and will probably be completely removed in the next major release). * As a result, `stk_predict` does not return a `.a`/`.v` structure any more. Instead, it returns an stk_dataframe object with two variables called `mean` and `var`. * The function that computes (the opposite of the log of) the restricted likelihood is now called `stk_param_relik` instead of `stk_remlqrg`. ## Internal structure * Many improvements in the internal structure of STK, for the sake of clarity (for those who happen to read the code) and efficiency: * `@stk_kreq_qr`: new class for encapsulating basic computations related to a Gaussian process (kriging) model. * The old `Kx_cache`/`Px_cache` mechanism, for working efficiently on finite spaces, has been replaced by a new covariance function: `stk_discretecov`. * A new framework to encapsulate various approaches to parallel computations. Currently only supporting `'none'` or `'parfor'` (Mathworks' PCT toolbox parfor loops) engines, more to come later. ## Experimental support for parameter objects. * `model.param` is now allowed to be an object from a user-defined class. This feature is experimental, and not really used currently in the toolbox. * A new function `stk_param_getdefaultbounds` has appeared in `./param`, that was previously hidden in `stk_predict`. It can be overridden in the case where `model.param` is an object from a user-defined class. ## New sampling algorithms and related functions * Fill-distance computation: exact (using Pronzato & Müller, Statistics & Computing, 2011) or approximate (using a space-filling reference set). * Van Der Corput and Halton RR2-scrambled sequences (quasi-MC) * NOLHS designs (Cioppa & Lucs, Technometrics, 2007) ## Miscellaneous * `misc/options`: a new system for managing options * `octave_quantile`: replacement for the missing `quantile` function in base Matlab (Mathworks' Statistics toolbox is not a requirement of STK). * Add MEX-files for computing "Gibbs-Paciorek quadratic forms" to support future work on non-stationary covariance functions. * `AUTHORS`: a list of maintainers and contributors can now be found at the root of the source tree. * `stk_compile_all`: now recompiles MEX-files automatically if the source code has changed. * Various new utility functions, tiny or not-so-tiny improvements, bugfixes here and there... ----- # Changes in version 1.2 ## `stk_predict` * Now offers the possibility to compute the posterior covariance matrix (it is returned as a fourth optional argument). * Has been modified to work with non-stationary covariance functions. ## Covariance functions * Added a new `"pairwise"` option to all covariance functions and also to `stk_dist` (formerly `stk_distance_matrix`). This options allows to compute only the diagonal of the full distance/covariance matrix). ## Space-filling designs * New function (`stk_filldist`) to compute the (discretized) fill distance. * New function (`stk_sampling_olhs`) to generate Orthogonal Latin Hypercube (OLH) samples using the algorithm of Ye (1998). ## Parameter estimation * New (experimental) function to choose automatically the starting point for a parameter estimation optimization procedure (`stk_param_init`). ## New functions to work with boxes * `stk_rescale`, * `stk_normalize`. ## More flexible representation of data * Improved the flexibility most functions (`stk_predict`, `stk_param_estim`, ...), which are now accepting both matrices and "data structures" (with an `.a` field) as input arguments. * New function: `stk_datastruct` ## Regular grids * New function `stk_plot2d` that serves has a wrapper around {`surf`|`contour`|`mesh`|`pcolor`}-type functions, to plot data defined over a two-dimensional regular grid. * `stk_sampling_regulargrid` now also returns 'ndgrid-style' coordinate matrices stored in new `.coord` field. ## Examples * Reorganized the example folder and renamed all example scripts. * New example (`stk_example_misc03`) to demonstrate the effect of adding a prior on the covariance parameters. * Improved graphical outputs in `stk_example_kb03`. * New test function: `stk_testfun_braninhoo` (Branin-Hoo). ## Miscellaneous * Renamed `stk_distancematrix` to `stk_dist`. * Various new utility functions: `stk_runexamples`, `stk_disp_framedtext`, `stk_disp_examplewelcome`, `stk_plot_shadedci`, `stk_octave_config`. * Improved Octave-specific configuration. * Lots of bugfixes and improvements. ----- # Changes in version 1.1 * New special functions for the Matérn 3/2 and 5/2 correlation functions (`stk_sf_matern32`, `stk_sf_matern52`). New covariance functions (`stk_materncov32_iso`, `stk_materncov32_aniso`, ...). * New MEX-file to compute the separation distance (`stk_mindist`). * New function to generate random Latin Hypercube Samples (`stk_sampling_randomlhs`). Renamed `stk_sampling_cartesiangrid` to `stk_sampling_regulargrid`, and changed the meaning of the first argument for consistency with other `stk_sampling_*` functions. * Improved `stk_model` function. Now provides default parameters for several families of covariance functions. * Renamed fields in model structures (`covariance_cache` to `Kx_cache` and `P0` to `Px_cache`). A new field `dim` has been added to the model structure. * Changed the order of the arguments of the functions that use the structure `model`. Now, `model` is always the first argument. * Changed `stk_param_estim` to make it possible to estimate noise variance. * Fixed issues in `stk_param_estim` related to the definition of the search domain and the selection of (constrained/unconstrained) optimizer. * Renamed `stk_conditionning` to `stk_conditioning`. * New functions for a more flexible and efficient management of STK's configuration in `stk_init` (path, compilation of MEX-file, checking for optional packages, selection of the default optimizer, ...). * New functions for unit testing, based on Octave's testing system (`stk_test`, `stk_runtests`). Tests have been added to most functions in the toolbox. * Improved documentation & new examples. * Improved argument checking and error messages. * Improved compatibility with older versions of Octave and Matlab. * Lots of minor changes and bug fixes. * Complete reorganization of the code (better directory structure). stk/doc/0000755000000000000000000000000013156161544007320 5ustar stk/doc/AUTHORS.md0000644000000000000000000000127513156161544010774 0ustar STK is mainly developped and maintained by (alphabetical order): * BECT Julien * VAZQUEZ Emmanuel The following people have helped develop the toolbox in various ways (from providing ideas and bug reports to actually contributing code): * ALEKSOVSKA Ivana * ASSOULINE Tom * AUTRET Florent * BENASSI Romain * DABOUSSI Elias * DRAUG Carnë * DUHAMEL Stephano * DUTRIEUX Héloïse * FELIOT Paul * FRASNEDO Sophie * JAN Benoit * KETTANI Othmane * KRAUTH Alexandra * LI Ling * PIERA-MARTINEZ Miguel * RAHALI Elham * RAVISANKAR Ashwin * RESSEGUIER Valentin * STROH Rémi * VILLEMONTEIX Julien Individual copyright notices are provided at the beginning of each file in the toolbox. stk/doc/README.md0000644000000000000000000001526213156161544010605 0ustar # STK: a Small (Matlab/Octave) Toolbox for Kriging This README file is part of *STK: a Small (Matlab/Octave) Toolbox for Kriging* STK 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. STK 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 STK. If not, see . ## General information Version: 2.5.0 (2017-09-13) Authors: See AUTHORS.md file Maintainers: Julien Bect and Emmanuel Vazquez Description: The STK is a (not so) Small Toolbox for Kriging. Its primary focus is on the interpolation/regression technique known as kriging, which is very closely related to Splines and Radial Basis Functions, and can be interpreted as a non-parametric Bayesian method using a Gaussian Process (GP) prior. The STK also provides tools for the sequential and non-sequential design of experiments. Even though it is, currently, mostly geared towards the Design and Analysis of Computer Experiments (DACE), the STK can be useful for other applications areas (such as Geostatistics, Machine Learning, Non-parametric Regression, etc.). Copyright: Large portions are Copyright (C) 2011-2014 SUPELEC. See individual copyright notices for more details. License: GNU General Public License, version 3 (GPLv3). See COPYING for the full license. URL: ## One toolbox, two flavours The STK toolbox comes in two flavours: * an "all purpose" release, which is suitable for use both with [GNU Octave](http://www.gnu.org/software/octave/) and with [Matlab](www.mathworks.com/products/matlab/). * an Octave package, for people who want to install and use STK as a regular [Octave package](http://www.gnu.org/software/octave/doc/interpreter/Packages.html#Packages). Hint: if you're not sure about the version that you have... * the "all purpose" release has this file (`README.md`) and the `stk_init` function (`stk_init.m`) in the top-level directory, * the Octave package has a `DESCRIPTION` file in the top-level directory and this file in the `doc/` subdirectory. ## Quick Start ### Quick start with the "all purpose" release (Matlab/Octave) Download and unpack an archive of the "all purpose" release from the [STK project](https://sourceforge.net/projects/kriging/) [file release system](https://sourceforge.net/projects/kriging/files/) on SourceForge. Run `stk_init.m` in either Octave or Matlab. After that, you should be able to run the examples located in the `examples` directory. All of them are scripts, the file name of which starts with the `stk_example_` prefix. For instance, type `stk_example_kb03` to run the third example in the "Kriging basics" series. ### Quick start with the Octave package release (Octave only) Assuming that you have a working Internet connection, typing `pkg install -forge stk` (from within Octave) will automatically download the latest STK package tarball from the [Octave Forge](http://octave.sourceforge.net/stk/index.html) [file release system](https://sourceforge.net/projects/octave/files/) on SourceForge and install it for you. Alternatively, if you want to install an older (or beta) release, you can download the tarball from either the STK project FRS or the Octave Forge FRS, and install it with `pkg install FILENAME.tar.gz`. After that, you can load STK using `pkg load stk`. To check that STK is properly loaded, try for instance `stk_example_kb03` to run the third example in the "Kriging basics" series. ## Requirements and recommendations ### Common requirement Your installation must be able to compile C mex files. ### Requirements and recommendations for use with GNU Octave The STK is tested to work with GNU Octave 3.6.2 or newer. ### Requirements and recommendations for use with Matlab The STK works with Matlab R2007a or newer. The Optimization Toolbox is recommended. The Parallel Computing Toolbox is optional. ## Content By publishing this toolbox, the idea is to provide a convenient and flexible research tool for working with kriging-based methods. The code of the toolbox is meant to be easily understandable, modular, and reusable. By way of illustration, it is very easy to use this toolbox for implementing the EGO algorithm [1]. Besides, this toolbox can serve as a basis for the implementation of advanced algorithms such as Stepwise Uncertainty Reduction (SUR) algorithms [2]. The toolbox consists of three parts: 1. The first part is the implementation of a number of covariance functions, and tools to compute covariance vectors and matrices. The structure of the STK makes it possible to use any kind of covariances: stationary or non-stationary covariances, aniso- tropic covariances, generalized covariances, etc. 2. The second part is the implementation of a REMAP procedure to estimate the parameters of the covariance. This makes it possible to deal with generalized covariances and to take into account prior knowledge about the parameters of the covariance. 3. The third part consists of prediction procedures. In its current form, the STK has been optimized to deal with moderately large data sets. ### References [1] D. R. Jones, M. Schonlau, and William J. Welch. *Efficient global optimization of expensive black-box functions*. Journal of Global Optimization, 13(4):455-492, 1998. [2] J. Bect, D. Ginsbourger, L. Li, V. Picheny, and E. Vazquez. *Sequential design of computer experiments for the estimation of a probability of failure*. Statistics and Computing, pages 1-21, 2011. DOI: 10.1007/s11222-011-9241-4. ## Ways to get help, report bugs, ask for new features... Use the "help" mailing-list: to ask for help on STK, and the ticket manager: to report bugs or ask for new features. stk/inst/0000755000000000000000000000000013156161544007530 5ustar stk/inst/arrays/0000755000000000000000000000000013156161544011031 5ustar stk/inst/arrays/@stk_dataframe/0000755000000000000000000000000013156161544013736 5ustar stk/inst/arrays/@stk_dataframe/abs.m0000644000000000000000000000223313156161544014661 0ustar % ABS [overload base function] % Copyright Notice % % Copyright (C) 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function ydata = abs (x) ydata = abs (x.data); end % function %!test %! u = rand (4, 3); x = stk_dataframe (u); v = abs (x); %! assert (strcmp (class (v), class (u)) && isequal (v, abs (u))) stk/inst/arrays/@stk_dataframe/acos.m0000644000000000000000000000224013156161544015037 0ustar % ACOS [overload base function] % Copyright Notice % % Copyright (C) 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function ydata = acos (x) ydata = acos (x.data); end % function %!test %! u = rand (4, 3); x = stk_dataframe (u); v = acos (x); %! assert (strcmp (class (v), class (u)) && isequal (v, acos (u))) stk/inst/arrays/@stk_dataframe/acosd.m0000644000000000000000000000224513156161544015210 0ustar % ACOSD [overload base function] % Copyright Notice % % Copyright (C) 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function ydata = acosd (x) ydata = acosd (x.data); end % function %!test %! u = rand (4, 3); x = stk_dataframe (u); v = acosd (x); %! assert (strcmp (class (v), class (u)) && isequal (v, acosd (u))) stk/inst/arrays/@stk_dataframe/acosh.m0000644000000000000000000000224513156161544015214 0ustar % ACOSH [overload base function] % Copyright Notice % % Copyright (C) 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function ydata = acosh (x) ydata = acosh (x.data); end % function %!test %! u = rand (4, 3); x = stk_dataframe (u); v = acosh (x); %! assert (strcmp (class (v), class (u)) && isequal (v, acosh (u))) stk/inst/arrays/@stk_dataframe/and.m0000644000000000000000000000205513156161544014660 0ustar % AND [overload base function] % Copyright Notice % % Copyright (C) 2017 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function y = and (x1, x2) y = (logical (x1) & logical (x2)); end % function stk/inst/arrays/@stk_dataframe/apply.m0000644000000000000000000000376513156161544015254 0ustar % APPLY maps a function to the rows or columns of a dataframe. % Copyright Notice % % Copyright (C) 2015 CentraleSupelec % Copyright (C) 2013 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function varargout = apply (x, dim, F, u) if nargin == 4 uu = {u}; else uu = {}; end varargout = cell (1, max (1, nargout)); if dim == 1 % act along columns [varargout{:}] = feval (F, x.data, uu{:}, 1); else if dim ~= 2, stk_error ('Incorrect dimension specifier', 'IncorrectDimSpec'); else % act along rows (less usual) [varargout{:}] = feval (F, x.data, uu{:}, 2); end end end % function %!shared x, t, u %! t = rand (3, 2); %! x = stk_dataframe (t); %!test u = apply (x, 1, @sum); %!assert (isequal (u, sum (t, 1))) %!test u = apply (x, 2, @sum); %!assert (isequal (u, sum (t, 2))) %!error u = apply (x, 3, @sum); %!test u = apply (x, 1, @min, []); %!assert (isequal (u, min (t, [], 1))) %!test u = apply (x, 2, @min, []); %!assert (isequal (u, min (t, [], 2))) %!error u = apply (x, 3, @min, []); %!test %! t = [1; 3; 2]; %! x = stk_dataframe (t); %! [M, k] = apply (x, 1, @max, []); %! assert ((M == 3) && (k == 2)); stk/inst/arrays/@stk_dataframe/asin.m0000644000000000000000000000224013156161544015044 0ustar % ASIN [overload base function] % Copyright Notice % % Copyright (C) 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function ydata = asin (x) ydata = asin (x.data); end % function %!test %! u = rand (4, 3); x = stk_dataframe (u); v = asin (x); %! assert (strcmp (class (v), class (u)) && isequal (v, asin (u))) stk/inst/arrays/@stk_dataframe/asind.m0000644000000000000000000000224513156161544015215 0ustar % ASIND [overload base function] % Copyright Notice % % Copyright (C) 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function ydata = asind (x) ydata = asind (x.data); end % function %!test %! u = rand (4, 3); x = stk_dataframe (u); v = asind (x); %! assert (strcmp (class (v), class (u)) && isequal (v, asind (u))) stk/inst/arrays/@stk_dataframe/asinh.m0000644000000000000000000000224513156161544015221 0ustar % ASINH [overload base function] % Copyright Notice % % Copyright (C) 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function ydata = asinh (x) ydata = asinh (x.data); end % function %!test %! u = rand (4, 3); x = stk_dataframe (u); v = asinh (x); %! assert (strcmp (class (v), class (u)) && isequal (v, asinh (u))) stk/inst/arrays/@stk_dataframe/atan.m0000644000000000000000000000224013156161544015035 0ustar % ATAN [overload base function] % Copyright Notice % % Copyright (C) 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function ydata = atan (x) ydata = atan (x.data); end % function %!test %! u = rand (4, 3); x = stk_dataframe (u); v = atan (x); %! assert (strcmp (class (v), class (u)) && isequal (v, atan (u))) stk/inst/arrays/@stk_dataframe/atand.m0000644000000000000000000000224513156161544015206 0ustar % ATAND [overload base function] % Copyright Notice % % Copyright (C) 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function ydata = atand (x) ydata = atand (x.data); end % function %!test %! u = rand (4, 3); x = stk_dataframe (u); v = atand (x); %! assert (strcmp (class (v), class (u)) && isequal (v, atand (u))) stk/inst/arrays/@stk_dataframe/atanh.m0000644000000000000000000000224513156161544015212 0ustar % ATANH [overload base function] % Copyright Notice % % Copyright (C) 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function ydata = atanh (x) ydata = atanh (x.data); end % function %!test %! u = rand (4, 3); x = stk_dataframe (u); v = atanh (x); %! assert (strcmp (class (v), class (u)) && isequal (v, atanh (u))) stk/inst/arrays/@stk_dataframe/bsxfun.m0000644000000000000000000000643013156161544015424 0ustar % BSXFUN [overload base function] % Copyright Notice % % Copyright (C) 2016 CentraleSupelec & LNE % Copyright (C) 2013 SUPELEC % % Authors: Julien Bect % Remi Stroh % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function y = bsxfun (F, x1, x2) %---- Compute ydata ----------------------------------------------------- x1data = double (x1); x2data = double (x2); try ydata = bsxfun (F, x1data, x2data); catch err = lasterror (); if strcmp (err.identifier, 'MATLAB:bsxfun:unsupportedBuiltin') % This happens in some old versions of Matlab with realpow, for % instance. Let's try without singleton expansion... ydata = feval (F, x1data, x2data); % TODO: manual bsxfun !!! else rethrow (err); end end %---- Choose column and row names --------------------------------------- if isa (x1, 'stk_dataframe') c1 = x1.colnames; r1 = x1.rownames; else c1 = {}; r1 = {}; end if isa (x2, 'stk_dataframe') c2 = x2.colnames; r2 = x2.rownames; else c2 = {}; r2 = {}; end [nr, nc] = size (ydata); if length (c1) == nc % Keep the columns names from the first dataframe (as in R) colnames = c1; elseif length (c2) == nc colnames = c2; else colnames = {}; end if length (r1) == nr % Keep the columns names from the first dataframe (as in R) rownames = r1; elseif length (r2) == nr rownames = r2; else rownames = {}; end %--- Create output ------------------------------------------------------ y = stk_dataframe (ydata, colnames, rownames); end % function %!shared x1, x2, data1, data2 %! x1 = rand (3, 2); data1 = stk_dataframe (x1); %! x2 = rand (3, 2); data2 = stk_dataframe (x2); %!test %! z = bsxfun (@plus, data1, x2); %! assert (isa (z, 'stk_dataframe') && isequal (double (z), x1 + x2)) %!test %! z = bsxfun (@plus, x1, data2); %! assert (isa (z, 'stk_dataframe') && isequal (double (z), x1 + x2)) %!test %! z = bsxfun (@plus, data1, data2); %! assert (isa (z, 'stk_dataframe') && isequal (double (z), x1 + x2)) %--- check the behaviour wrt column / row names -------------------------------- %!shared x, y %! x = stk_dataframe (randn (2), {'x1', 'x2'}, {'a'; 'b'}); %! y = stk_dataframe (randn (2), {'y1', 'y2'}, {'c'; 'd'}); %!test z = x + y; %! assert (isequal (z.colnames, x.colnames)); %! assert (isequal (z.rownames, x.rownames)); %!test z = y + x; %! assert (isequal (z.colnames, y.colnames)); %! assert (isequal (z.rownames, y.rownames)); stk/inst/arrays/@stk_dataframe/cat.m0000644000000000000000000000352313156161544014666 0ustar % CAT [overload base function] % Copyright Notice % % Copyright (C) 2013 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function z = cat(dim, varargin) if dim == 1 % concatenate along dimension 1, i.e., vertically z = vertcat(varargin{:}); else if dim ~= 2 errmsg = 'Dataframes can only be concatenated along dimension 1 or 2.'; stk_error(errmsg, 'InvalidArgument'); else % concatenate along dimension 2, i.e., horizontally z = horzcat(varargin{:}); end end % if end % function %!shared u, v, x, y %! u = rand(3, 2); %! v = rand(3, 2); %! x = stk_dataframe(u); %! y = stk_dataframe(v); %!test % vertical %! z = cat(1, x, y); %! assert(isa(z, 'stk_dataframe')); %! assert(isequal(double(z), [u; v])); %!error z = cat(3, x, y); %!test % horizontal %! y = stk_dataframe(v, {'y1' 'y2'}); %! z = cat(2, x, y); %! assert(isa(z, 'stk_dataframe')); %! assert(isequal(double(z), [u v])); %! assert(all(strcmp(z.colnames, {'' '' 'y1' 'y2'}))); stk/inst/arrays/@stk_dataframe/cos.m0000644000000000000000000000223313156161544014700 0ustar % COS [overload base function] % Copyright Notice % % Copyright (C) 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function ydata = cos (x) ydata = cos (x.data); end % function %!test %! u = rand (4, 3); x = stk_dataframe (u); v = cos (x); %! assert (strcmp (class (v), class (u)) && isequal (v, cos (u))) stk/inst/arrays/@stk_dataframe/cosd.m0000644000000000000000000000224013156161544015042 0ustar % COSD [overload base function] % Copyright Notice % % Copyright (C) 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function ydata = cosd (x) ydata = cosd (x.data); end % function %!test %! u = rand (4, 3); x = stk_dataframe (u); v = cosd (x); %! assert (strcmp (class (v), class (u)) && isequal (v, cosd (u))) stk/inst/arrays/@stk_dataframe/cosh.m0000644000000000000000000000223713156161544015054 0ustar % ABS [overload base function] % Copyright Notice % % Copyright (C) 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function ydata = cosh (x) ydata = cosh (x.data); end % function %!test %! u = rand (4, 3); x = stk_dataframe (u); v = cosh (x); %! assert (strcmp (class (v), class (u)) && isequal (v, cosh (u))) stk/inst/arrays/@stk_dataframe/ctranspose.m0000644000000000000000000000277613156161544016311 0ustar % CTRANSPOSE [overload base function] % Copyright Notice % % Copyright (C) 2013 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function y = ctranspose(x) rn = get(x, 'rownames'); cn = get(x, 'colnames'); y = stk_dataframe(ctranspose(x.data), rn', cn'); end % function % note: complex-valued dataframes are supported but, currently, % not properly displayed %!test %! u = rand(3, 2) + 1i * rand(3, 2); %! data = stk_dataframe(u, {'x' 'y'}, {'obs1'; 'obs2'; 'obs3'}); %! data = data'; %! assert (isa(data, 'stk_dataframe') && isequal(double(data), u')); %! assert (isequal(data.rownames, {'x'; 'y'})); %! assert (isequal(data.colnames, {'obs1' 'obs2' 'obs3'})); stk/inst/arrays/@stk_dataframe/diff.m0000644000000000000000000000205113156161544015022 0ustar % DIFF [overload base function] % Copyright Notice % % Copyright (C) 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function z = diff (x, varargin) z = diff (x.data, varargin{:}); end % function stk/inst/arrays/@stk_dataframe/disp.m0000644000000000000000000000357413156161544015064 0ustar % DISP [overload base function] % % Example: % format short % x = [1 1e6 rand; 10 -1e10 rand; 100 1e-22 rand]; % disp (stk_dataframe (x)) % Copyright Notice % % Copyright (C) 2017 CentraleSupelec % Copyright (C) 2013, 2014 SUPELEC % % Authors: Julien Bect % Emmanuel Vazquez % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function disp (x, verbosity, prefix, data_col_width) if (nargin < 2) || (isempty (verbosity)) verbosity = stk_options_get ('stk_dataframe', 'disp_format'); end if (nargin < 3) || (isempty (prefix)) prefix = ' '; end if (nargin < 4) || (isempty (data_col_width)) data_col_width = []; end s = stk_sprintf (x, verbosity, data_col_width); disp ([repmat(prefix, size(s, 1), 1) s]); end % function %!shared x, fmt %! fmt = stk_disp_getformat (); %! x = stk_dataframe (rand (3, 2)); %!test format rat; disp (x); %!test format long; disp (x); %!test format short; disp (x); format (fmt); %!test disp (stk_dataframe (zeros (0, 1))) %!test disp (stk_dataframe (zeros (0, 2))) stk/inst/arrays/@stk_dataframe/display.m0000644000000000000000000000274613156161544015572 0ustar % DISPLAY [overload base function] % % Example: % format short % x = [1 1e6 rand; 10 -1e10 rand; 100 1e-22 rand]; % stk_dataframe(x) % implicitely calls display() % Copyright Notice % % Copyright (C) 2013, 2014 SUPELEC % % Authors: Julien Bect % Emmanuel Vazquez % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function display (x, varargin) fprintf ('\n%s = <%s>', inputname (1), stk_sprintf_sizetype (x)); if strcmp ('basic', stk_options_get ('stk_dataframe', 'disp_format')) fprintf ('\n\n'); end disp (x, varargin{:}); fprintf ('\n'); end % function %!test display (stk_dataframe (rand (3, 2))); stk/inst/arrays/@stk_dataframe/double.m0000644000000000000000000000274513156161544015376 0ustar % DOUBLE [overload base function] % Copyright Notice % % Copyright (C) 2015 CentraleSupelec % Copyright (C) 2013 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function xdata = double(x) xdata = double(x.data); end % function %!test %! u = rand(4, 3); %! x = stk_dataframe(u); %! v = double(x); %! assert (strcmp(class(v), 'double') && isequal(v, u)) %!test %! u = (rand(4, 3) < 0.5); %! x = stk_dataframe(u); %! v = double(x); %! assert (strcmp(class(v), 'double') && isequal(v, double(u))) %!test %! u = uint8 (rand (4, 3) * 5); %! x = stk_dataframe(u); %! v = double(x); %! assert (strcmp(class(v), 'double') && isequal(v, double(u))) stk/inst/arrays/@stk_dataframe/end.m0000644000000000000000000000374113156161544014667 0ustar % END implements the the 'end' keyword for indexing % Copyright Notice % % Copyright (C) 2013 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function idx = end (x, k, nb_indices) if nb_indices == 2, % using two indices (matrix-style indexing) idx = size (x.data, k); else if nb_indices ~= 1, errmsg = 'stk_dataframe objects only support linear or matrix-style indexing.'; stk_error (errmsg, 'IllegalIndexing'); else % using linear indexing idx = numel (x.data); end end end % function %--- tests with a univariate dataframe ---------------------------------------- %!shared x %! x = stk_dataframe ([1; 2; 3]); %!assert (isequal (double (x(2:end, :)), [2; 3])) %!assert (isequal (double (x(2:end)), [2; 3])) %!assert (isequal (double (x(2, 1:end)), 2)) %!assert (isequal (double (x(end)), 3)) %--- tests with a bivariate dataframe ----------------------------------------- %!shared x %! x = stk_dataframe ([1 2; 3 4; 5 6]); %!assert (isequal (x(2:end, :), x(2:3, :))) %!assert (isequal (x(2, 1:end), x(2, :))) %!assert (isequal (x(2:end, 2:end), x(2:3, 2))) %!error x(1:end, 1:end, 1:end) stk/inst/arrays/@stk_dataframe/eq.m0000644000000000000000000000205213156161544014520 0ustar % EQ [overload base function] % Copyright Notice % % Copyright (C) 2017 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function y = eq (x1, x2) y = (double (x1) == double (x2)); end % function stk/inst/arrays/@stk_dataframe/exp.m0000644000000000000000000000223313156161544014710 0ustar % EXP [overload base function] % Copyright Notice % % Copyright (C) 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function ydata = exp (x) ydata = exp (x.data); end % function %!test %! u = rand (4, 3); x = stk_dataframe (u); v = exp (x); %! assert (strcmp (class (v), class (u)) && isequal (v, exp (u))) stk/inst/arrays/@stk_dataframe/expm1.m0000644000000000000000000000224513156161544015151 0ustar % EXPM1 [overload base function] % Copyright Notice % % Copyright (C) 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function ydata = expm1 (x) ydata = expm1 (x.data); end % function %!test %! u = rand (4, 3); x = stk_dataframe (u); v = expm1 (x); %! assert (strcmp (class (v), class (u)) && isequal (v, expm1 (u))) stk/inst/arrays/@stk_dataframe/fieldnames.m0000644000000000000000000000316613156161544016231 0ustar % FIELDNAMES [overload base function] % Copyright Notice % % Copyright (C) 2017 CentraleSupelec % Copyright (C) 2013 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function fn = fieldnames (x) % Non-empty column names cn = x.colnames; cn = cn(~ cellfun (@isempty, cn)); % Non-empty row names rn = x.rownames; rn = rn(~ cellfun (@isempty, rn))'; fn = [cn rn reserved_field_names()]; end % function %!test %! x = stk_dataframe (rand (3, 2), {'u' 'v'}); %! s1 = sort (fieldnames (x)); %! s2 = {'colnames' 'data' 'info' 'rownames' 'u' 'v'}; %! assert (all (strcmp (s1, s2))); %!test %! x = stk_dataframe (rand (3, 2)); %! x.rownames(2:3) = {'aa', 'bb'}; %! x.colnames{2} = 'toto'; %! assert (isequal (fieldnames (x), ... %! {'toto' 'aa' 'bb' 'data' 'info' 'rownames' 'colnames'})); stk/inst/arrays/@stk_dataframe/find.m0000644000000000000000000000254313156161544015040 0ustar % @STK_DATAFRAME/FIND [overload base function] % % See also: find % Copyright Notice % % Copyright (C) 2017 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function varargout = find (x, varargin) if isa (x, 'stk_dataframe') varargout = cell (1, max (nargout, 1)); [varargout{:}] = find (logical (x), varargin{:}); else stk_error (['@stk_dataframe/find only supports stk_dataframe objects ' ... 'for the first input argument.'], 'InvalidArgument'); end end % function stk/inst/arrays/@stk_dataframe/ge.m0000644000000000000000000000205213156161544014506 0ustar % GE [overload base function] % Copyright Notice % % Copyright (C) 2017 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function y = ge (x1, x2) y = (double (x1) >= double (x2)); end % function stk/inst/arrays/@stk_dataframe/get.m0000644000000000000000000000257313156161544014702 0ustar % GET [overload base function] % Copyright Notice % % Copyright (C) 2013 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function value = get (x, propname) icol = __get_column_number__ (x.colnames, propname); switch icol case -4 % 'info' value = x.info; case -3 % 'rownames' value = x.rownames; case -2 % 'colnames' value = x.colnames; case -1 % get entire array value = x.data; otherwise value = x.data(:, icol); end end % function stk/inst/arrays/@stk_dataframe/gt.m0000644000000000000000000000205113156161544014524 0ustar % GT [overload base function] % Copyright Notice % % Copyright (C) 2017 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function y = gt (x1, x2) y = (double (x1) > double (x2)); end % function stk/inst/arrays/@stk_dataframe/horzcat.m0000644000000000000000000001154213156161544015571 0ustar % HORZCAT [overload base function] % Copyright Notice % % Copyright (C) 2015 CentraleSupelec % Copyright (C) 2013, 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function x = horzcat (x, y, varargin) if nargin < 2, y = []; end %--- Get raw data --------------------------------------------------------- x_data = double (x); y_data = double (y); %--- Get column and row names of inputs ----------------------------------- if isa (x, 'stk_dataframe') x_colnames = get (x, 'colnames'); x_rownames = get (x, 'rownames'); else x_colnames = {}; x_rownames = {}; end if isa (y, 'stk_dataframe') y_colnames = get (y, 'colnames'); y_rownames = get (y, 'rownames'); else y_colnames = {}; y_rownames = {}; end %--- Create output row names ---------------------------------------------- if isempty (x_rownames) rownames = y_rownames; elseif isempty (y_rownames) rownames = x_rownames; else if (~ isequal (size (x_rownames), size (y_rownames))) ... || (any (~ strcmp (x_rownames, y_rownames))) warning ('STK:horzcat:IncompatibleRowNames', sprintf ( ... ['Incompatible row names !\nThe output of horzcat will ' ... 'have no row names.'])); rownames = {}; else rownames = x_rownames; end end %--- Create output column names ------------------------------------------- bx = isempty (x_colnames); by = isempty (y_colnames); if bx && by, % none of the argument has row names colnames = {}; else % at least of one the arguments has column names if bx, x_colnames = repmat ({''}, 1, size (x_data, 2)); end if by, y_colnames = repmat ({''}, 1, size (y_data, 2)); end colnames = [x_colnames y_colnames]; end %--- Create output -------------------------------------------------------- if strcmp (class (x), 'stk_dataframe') %#ok % Optimize for speed (no need to call constructor) x.data = [x_data y_data]; x.colnames = colnames; x.rownames = rownames; else x = stk_dataframe ([x_data y_data], colnames, rownames); end if ~ isempty (varargin), x = horzcat (x, varargin{:}); end end % function % IMPORTANT NOTE: [x y ...] fails to give the same result as horzcat (x, y, % ...) in some releases of Octave. As a consequence, all tests must be % written using horzcat explicitely. %!shared u, v %! u = rand(3, 2); %! v = rand(3, 2); %% % Horizontal concatenation of two dataframes %!test %! x = stk_dataframe(u, {'x1' 'x2'}); %! y = stk_dataframe(v, {'y1' 'y2'}); %! z = horzcat (x, y); %! assert(isa(z, 'stk_dataframe') && isequal(double(z), [u v])); %! assert(all(strcmp(z.colnames, {'x1' 'x2' 'y1' 'y2'}))); %!test %! x = stk_dataframe(u, {'x1' 'x2'}, {'a'; 'b'; 'c'}); %! y = stk_dataframe(v, {'y1' 'y2'}); %! z = horzcat (x, y); %! assert(isa(z, 'stk_dataframe') && isequal(double(z), [u v])); %! assert(all(strcmp(z.colnames, {'x1' 'x2' 'y1' 'y2'}))); %! assert(all(strcmp(z.rownames, {'a'; 'b'; 'c'}))); %!test %! x = stk_dataframe(u, {'x1' 'x2'}); %! y = stk_dataframe(v, {'y1' 'y2'}, {'a'; 'b'; 'c'}); %! z = horzcat (x, y); %! assert(isa(z, 'stk_dataframe') && isequal(double(z), [u v])); %! assert(all(strcmp(z.colnames, {'x1' 'x2' 'y1' 'y2'}))); %! assert(all(strcmp(z.rownames, {'a'; 'b'; 'c'}))); %!test % incompatible row names %! x = stk_dataframe (u, {'x1' 'x2'}, {'a'; 'b'; 'c'}); %! y = stk_dataframe (v, {'y1' 'y2'}, {'a'; 'b'; 'd'}); %! z = horzcat (x, y); %! assert (isequal (z.rownames, {})); %% % Horizontal concatenation [dataframe matrix] or [matrix dataframe] %!test %! x = stk_dataframe (u); %! z = horzcat (x, v); %! assert (isa (z, 'stk_dataframe') && isequal (double (z), [u v])); %!test %! y = stk_dataframe (v); %! z = horzcat (u, y); %! assert (isa (z, 'stk_dataframe') && isequal (double (z), [u v])); %% % Horizontal concatenation of more than two elements %!test %! x = stk_dataframe(u, {'x1' 'x2'}); %! y = stk_dataframe(v, {'y1' 'y2'}); %! z = horzcat (x, y, u, v); %! assert(isa(z, 'stk_dataframe') && isequal(double(z), [u v u v])); stk/inst/arrays/@stk_dataframe/isempty.m0000644000000000000000000000203013156161544015601 0ustar % ISEMPTY [overload base function] % Copyright Notice % % Copyright (C) 2013 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function b = isempty(x) b = isempty(x.data); end % function stk/inst/arrays/@stk_dataframe/isequal.m0000644000000000000000000000306713156161544015565 0ustar % ISEQUAL [overload base function] % Copyright Notice % % Copyright (C) 2017 CentraleSupelec % Copyright (C) 2013 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . % INTERNAL NOTE: overloaded for Octave 3.2.x compat / see CODING_GUIDELINES function b = isequal (x, y, varargin) if nargin < 2 stk_error ('Not enough input arguments.', 'NotEnoughInputArgs'); end % First, make sure that x and y belong to the same class % (either stk_dataframe or some derived class) b = isa (x, 'stk_dataframe') && strcmp (class (y), class (x)) ... && isequal (x.data, y.data) ... && isequal (x.colnames, y.colnames) && isequal (x.rownames, y.rownames); if b && (nargin > 2) b = isequal (x, varargin{:}); end end % function stk/inst/arrays/@stk_dataframe/isfinite.m0000644000000000000000000000225013156161544015725 0ustar % ISFINITE [overload base function] % Copyright Notice % % Copyright (C) 2017 CentraleSupelec % % Author: Remi Stroh % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function ydata = isfinite (x) ydata = isfinite (x.data); end % function %!test %! u = [pi, NaN, Inf, -Inf]; x = stk_dataframe (u); v = isfinite (x); %! assert (islogical (v) && isequal (v, isfinite (u))) stk/inst/arrays/@stk_dataframe/isinf.m0000644000000000000000000000223113156161544015222 0ustar % ISINF [overload base function] % Copyright Notice % % Copyright (C) 2017 CentraleSupelec % % Author: Remi Stroh % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function ydata = isinf (x) ydata = isinf (x.data); end % function %!test %! u = [pi, NaN, Inf, -Inf]; x = stk_dataframe (u); v = isinf (x); %! assert (islogical (v) && isequal (v, isinf (u))) stk/inst/arrays/@stk_dataframe/ismember.m0000644000000000000000000000370013156161544015717 0ustar % ISMEMBER [overload base function] % Copyright Notice % % Copyright (C) 2017 CentraleSupelec % Copyright (C) 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function varargout = ismember (A, B, varargin) if ~ all (cellfun (@ischar, varargin)) stk_error ('Invalid flag (should be a string).', 'InvalidArgument'); end varargout = cell (1, max (nargout, 1)); if isa (A, 'stk_dataframe') [varargout{:}] = ismember (A.data, B, varargin{:}); else % B is an stk_dataframe object [varargout{:}] = ismember (A, B.data, varargin{:}); end end % function %!shared u, x, u1, x1, u2, x2 %! u = rand (10, 4); %! x = stk_dataframe (u); %! x1 = x(1, :); %! u1 = double (x1); %! u2 = - ones (1, 4); %! x2 = stk_dataframe (u2); %!assert (ismember (u1, x, 'rows')) %!assert (ismember (x1, u, 'rows')) %!assert (ismember (x1, x, 'rows')) %!assert (~ ismember (u2, x, 'rows')) %!assert (~ ismember (x2, u, 'rows')) %!assert (~ ismember (x2, x, 'rows')) %!test %! [b, idx] = ismember ([x2; x1; x1], x, 'rows'); %! assert (isequal (b, [false; true; true])); %! assert (isequal (idx, [0; 1; 1])) stk/inst/arrays/@stk_dataframe/isnan.m0000644000000000000000000000223113156161544015222 0ustar % ISNAN [overload base function] % Copyright Notice % % Copyright (C) 2017 CentraleSupelec % % Author: Remi Stroh % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function ydata = isnan (x) ydata = isnan (x.data); end % function %!test %! u = [pi, NaN, Inf, -Inf]; x = stk_dataframe (u); v = isnan (x); %! assert (islogical (v) && isequal (v, isnan (u))) stk/inst/arrays/@stk_dataframe/ldivide.m0000644000000000000000000000235013156161544015534 0ustar % LDIVIDE [overload base function] % Copyright Notice % % Copyright (C) 2013 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function y = ldivide(x1, x2) y = bsxfun(@ldivide, x1, x2); end % function %!test stk_test_dfbinaryop(@ldivide, 1 + rand(7, 2), rand(7, 2)); %!test stk_test_dfbinaryop(@ldivide, 1 + rand(7, 2), pi); %!error stk_test_dfbinaryop(@ldivide, 1 + rand(7, 2), rand(7, 3)); stk/inst/arrays/@stk_dataframe/le.m0000644000000000000000000000205213156161544014513 0ustar % LE [overload base function] % Copyright Notice % % Copyright (C) 2017 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function y = le (x1, x2) y = (double (x1) <= double (x2)); end % function stk/inst/arrays/@stk_dataframe/length.m0000644000000000000000000000225613156161544015402 0ustar % LENGTH [overload base function] % Copyright Notice % % Copyright (C) 2013 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function N = length (x) %#ok errmsg = ['length() is not defined for objects of class ' class(x)]; stk_error (errmsg, 'MethodNotDefined'); end % function %!error length (stk_dataframe ([1 2; 3 4; 5 6])) stk/inst/arrays/@stk_dataframe/log.m0000644000000000000000000000223313156161544014675 0ustar % LOG [overload base function] % Copyright Notice % % Copyright (C) 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function ydata = log (x) ydata = log (x.data); end % function %!test %! u = rand (4, 3); x = stk_dataframe (u); v = log (x); %! assert (strcmp (class (v), class (u)) && isequal (v, log (u))) stk/inst/arrays/@stk_dataframe/log10.m0000644000000000000000000000224513156161544015041 0ustar % LOG10 [overload base function] % Copyright Notice % % Copyright (C) 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function ydata = log10 (x) ydata = log10 (x.data); end % function %!test %! u = rand (4, 3); x = stk_dataframe (u); v = log10 (x); %! assert (strcmp (class (v), class (u)) && isequal (v, log10 (u))) stk/inst/arrays/@stk_dataframe/log1p.m0000644000000000000000000000224513156161544015141 0ustar % LOG1P [overload base function] % Copyright Notice % % Copyright (C) 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function ydata = log1p (x) ydata = log1p (x.data); end % function %!test %! u = rand (4, 3); x = stk_dataframe (u); v = log1p (x); %! assert (strcmp (class (v), class (u)) && isequal (v, log1p (u))) stk/inst/arrays/@stk_dataframe/log2.m0000644000000000000000000000224013156161544014755 0ustar % LOG2 [overload base function] % Copyright Notice % % Copyright (C) 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function ydata = log2 (x) ydata = log2 (x.data); end % function %!test %! u = rand (4, 3); x = stk_dataframe (u); v = log2 (x); %! assert (strcmp (class (v), class (u)) && isequal (v, log2 (u))) stk/inst/arrays/@stk_dataframe/logical.m0000644000000000000000000000273513156161544015535 0ustar % LOGICAL [overload base function] % Copyright Notice % % Copyright (C) 2016 CentraleSupelec & LNE % % Author: Remi Stroh % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function xdata = logical (x) xdata = logical (x.data); end % function %!test %! u = rand (4, 3); %! x = stk_dataframe (u); %! v = logical (x); %! assert (strcmp (class(v), 'logical') && isequal (v, logical (u))) %!test %! u = (rand (4, 3) < 0.5); %! x = stk_dataframe (u); %! v = logical (x); %! assert (strcmp (class (v), 'logical') && isequal (v, u)) %!test %! u = uint8 (rand (4, 3) * 5); %! x = stk_dataframe (u); %! v = logical (x); %! assert (strcmp (class (v), 'logical') && isequal (v, logical (u))) stk/inst/arrays/@stk_dataframe/lt.m0000644000000000000000000000205113156161544014531 0ustar % LT [overload base function] % Copyright Notice % % Copyright (C) 2017 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function y = lt (x1, x2) y = (double (x1) < double (x2)); end % function stk/inst/arrays/@stk_dataframe/max.m0000644000000000000000000000413313156161544014702 0ustar % MAX [overload base function] % Copyright Notice % % Copyright (C) 2015 CentraleSupelec % Copyright (C) 2013 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function varargout = max (x, y, dim) if nargin > 3, stk_error ('Too many input arguments.', 'TooManyInputArgs'); end varargout = cell (1, max (1, nargout)); if (nargin < 2) || (isempty (y)), % Act on rows or columns if nargin < 3, dim = 1; end [varargout{:}] = apply (x, dim, @max, []); else % Apply 'max' elementwise if nargin > 2, errmsg = 'Too many input arguments (elementwise max assumed)'; stk_error(errmsg, 'TooManyInputArgs'); else [varargout{:}] = bsxfun (@max, x, y); end end % if end % function %!test stk_test_dfbinaryop ('max', rand(7, 2), rand(7, 2)); %!test stk_test_dfbinaryop ('max', rand(7, 2), pi); %!error stk_test_dfbinaryop ('max', rand(7, 2), rand(7, 3)); %!shared x1, df1 %! x1 = rand(9, 3); %! df1 = stk_dataframe(x1, {'a', 'b', 'c'}); %!assert (isequal (max(df1), max(x1))) %!assert (isequal (max(df1, [], 1), max(x1))) %!assert (isequal (max(df1, [], 2), max(x1, [], 2))) %!error (max(df1, df1, 2)) %!test %! x = stk_dataframe ([1; 3; 2]); %! [M, k] = max (x); %! assert ((M == 3) && (k == 2)); stk/inst/arrays/@stk_dataframe/mean.m0000644000000000000000000000242413156161544015036 0ustar % MEAN [overload base function] % Copyright Notice % % Copyright (C) 2013 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function z = mean(x, dim) if nargin < 2, dim = 1; end z = apply(x, dim, @mean); end % function %!shared x1, df1 %! x1 = rand(9, 3); %! df1 = stk_dataframe(x1, {'a', 'b', 'c'}); %!assert (isequal (mean(df1), mean(x1))) %!assert (isequal (mean(df1, 1), mean(x1))) %!assert (isequal (mean(df1, 2), mean(x1, 2))) stk/inst/arrays/@stk_dataframe/median.m0000644000000000000000000000244613156161544015357 0ustar % MEDIAN [overload base function] % Copyright Notice % % Copyright (C) 2013 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function z = median(x, dim) if nargin < 2, dim = 1; end z = apply(x, dim, @median); end % function %!shared x1, df1 %! x1 = rand(9, 3); %! df1 = stk_dataframe(x1, {'a', 'b', 'c'}); %!assert (isequal (median(df1), median(x1))) %!assert (isequal (median(df1, 1), median(x1))) %!assert (isequal (median(df1, 2), median(x1, 2))) stk/inst/arrays/@stk_dataframe/min.m0000644000000000000000000000413413156161544014701 0ustar % MIN [overload base function] % Copyright Notice % % Copyright (C) 2015 CentraleSupelec % Copyright (C) 2013 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function varargout = min (x, y, dim) if nargin > 3, stk_error ('Too many input arguments.', 'TooManyInputArgs'); end varargout = cell (1, max (1, nargout)); if (nargin < 2) || (isempty (y)), % Act on rows or columns if nargin < 3, dim = 1; end [varargout{:}] = apply (x, dim, @min, []); else % Apply 'min' elementwise if nargin > 2, errmsg = 'Too many input arguments (elementwise min assumed)'; stk_error (errmsg, 'TooManyInputArgs'); else [varargout{:}] = bsxfun (@min, x, y); end end % if end % function %!test stk_test_dfbinaryop ('min', rand(7, 2), rand(7, 2)); %!test stk_test_dfbinaryop ('min', rand(7, 2), pi); %!error stk_test_dfbinaryop ('min', rand(7, 2), rand(7, 3)); %!shared x1, df1 %! x1 = rand(9, 3); %! df1 = stk_dataframe(x1, {'a', 'b', 'c'}); %!assert (isequal (min(df1), min(x1))) %!assert (isequal (min(df1, [], 1), min(x1))) %!assert (isequal (min(df1, [], 2), min(x1, [], 2))) %!error (min(df1, df1, 2)) %!test %! x = stk_dataframe ([5; 2; 4]); %! [M, k] = min (x); %! assert ((M == 2) && (k == 2)); stk/inst/arrays/@stk_dataframe/minus.m0000644000000000000000000000232013156161544015244 0ustar % MINUS [overload base function] % Copyright Notice % % Copyright (C) 2013 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function y = minus(x1, x2) y = bsxfun(@minus, x1, x2); end % function %!test stk_test_dfbinaryop(@minus, rand(7, 2), rand(7, 2)); %!test stk_test_dfbinaryop(@minus, rand(7, 2), pi); %!error stk_test_dfbinaryop(@minus, rand(7, 2), rand(7, 3)); stk/inst/arrays/@stk_dataframe/mldivide.m0000644000000000000000000000442013156161544015711 0ustar % MLDIVIDE [overload base function] % Copyright Notice % % Copyright (C) 2015, 2017 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function y = mldivide (x1, x2) if isa (x1, 'stk_dataframe') x1_data = x1.data; rownames = x1.colnames; if isa (x2, 'stk_dataframe') % both are stk_dataframe objects x2_data = x2.data; colnames = x2.colnames; else % x1 is an stk_dataframe object, but not x2 x2_data = x2; colnames = {}; end else % x2 is an stk_dataframe object, but x1 is not x1_data = x1; x2_data = x2.data; colnames = x2.colnames; if isscalar (x1) % special case rownames = x2.rownames; else rownames = {}; end end y = stk_dataframe (x1_data \ x2_data, colnames, rownames); end % function %!test %! x1_data = [57 7; 2 0]; %! x1 = stk_dataframe (x1_data, {'x' 'y'}, {'a'; 'b'}); %! x2_data = [8 7; 2 0]; %! x2 = stk_dataframe (x2_data, {'w' 'z'}, {'a'; 'b'}); %! y = x2 \ x1; %! assert (stk_isequal_tolabs (y, ... %! stk_dataframe ([1 0; 7 1], {'x'; 'y'}, {'w'; 'z'}))); % Special case: division by a scalar %!shared x_data, x, y_data, y %! x_data = [3 3; 6 3; 9 12]; %! y_data = [1 1; 2 1; 3 4]; %! x = stk_dataframe (x_data, {'x' 'y'}, {'a'; 'b'; 'c'}); %!test y = 3 \ x; %!assert (isequal (y, stk_dataframe (y_data, {'x' 'y'}, {'a'; 'b'; 'c'}))); %!error y = x \ 3; stk/inst/arrays/@stk_dataframe/mode.m0000644000000000000000000000243713156161544015046 0ustar % MODE [overload base function] % Copyright Notice % % Copyright (C) 2013 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function z = mode(x, dim) if nargin < 2, dim = 1; end z = apply(x, dim, @mode); end % function %!shared x1, df1 %! x1 = floor(3 * rand(9, 3)); %! df1 = stk_dataframe(x1, {'a', 'b', 'c'}); %!assert (isequal (mode(df1), mode(x1))) %!assert (isequal (mode(df1, 1), mode(x1))) %!assert (isequal (mode(df1, 2), mode(x1, 2))) stk/inst/arrays/@stk_dataframe/mrdivide.m0000644000000000000000000000440013156161544015715 0ustar % MRDIVIDE [overload base function] % Copyright Notice % % Copyright (C) 2015, 2017 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function y = mrdivide (x1, x2) if isa (x1, 'stk_dataframe') x1_data = x1.data; rownames = x1.rownames; if isa (x2, 'stk_dataframe') % both are stk_dataframe objects x2_data = x2.data; colnames = x2.rownames; else x2_data = x2; if isscalar (x2) % special case colnames = x1.colnames; else colnames = {}; end end else % x2 is an stk_dataframe object, but x1 is not x1_data = x1; rownames = {}; x2_data = x2.data; colnames = x2.rownames; end y = stk_dataframe (x1_data / x2_data, colnames, rownames); end % function %!test %! x1_data = [8 7; 58 49]; %! x1 = stk_dataframe (x1_data, {'x' 'y'}, {'a'; 'b'}); %! x2_data = [8 7; 2 0]; %! x2 = stk_dataframe (x2_data, {'x' 'y'}, {'u'; 'v'}); %! y = x1 / x2; %! assert (stk_isequal_tolabs (y, ... %! stk_dataframe ([1 0; 7 1], {'u'; 'v'}, {'a'; 'b'}))); % Special case: division by a scalar %!shared x_data, x, y_data, y %! x_data = [3 3; 6 3; 9 12]; %! y_data = [1 1; 2 1; 3 4]; %! x = stk_dataframe (x_data, {'x' 'y'}, {'a'; 'b'; 'c'}); %!test y = x / 3; %!assert (isequal (y, stk_dataframe ([1 1; 2 1; 3 4], {'x' 'y'}, {'a'; 'b'; 'c'}))); %!error y = 3 / x; stk/inst/arrays/@stk_dataframe/mtimes.m0000644000000000000000000000474613156161544015425 0ustar % MTIMES [overload base function] % Copyright Notice % % Copyright (C) 2015 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function y = mtimes (x1, x2) if isa (x1, 'stk_dataframe') x1_data = x1.data; rownames = x1.rownames; if isa (x2, 'stk_dataframe') % both are stk_dataframe objects x2_data = x2.data; colnames = x2.colnames; else % x1 is an stk_dataframe object, but not x2 x2_data = x2; if isscalar (x2) % special case colnames = x1.colnames; else colnames = {}; end end else % x2 is an stk_dataframe object, but x1 is not x1_data = x1; x2_data = x2.data; colnames = x2.colnames; if isscalar (x1) % special case rownames = x2.rownames; else rownames = {}; end end y = stk_dataframe (x1_data * x2_data, colnames, rownames); end % function %!shared x, y, z, w %! %! u = [1 3 4; 2 7 6]; % 2 x 3 %! v = [6 2; 1 7; 9 4]; % 3 x 2 %! w = [45 39; 73 77]; % u * v %! %! x = stk_dataframe (u, {}, {'a'; 'b'}); %! y = stk_dataframe (v, {'c' 'd'}); %! z = x * y; %!assert (isa (z, 'stk_dataframe')); %!assert (isequal (z.data, w)); %!assert (isequal (z.rownames, x.rownames)); %!assert (isequal (z.colnames, y.colnames)); % Special case: multiplication by a scalar %!shared x, y %! x = stk_dataframe (rand (3, 2), {'x' 'y'}, {'a'; 'b'; 'c'}); %!test y = 3 * x; %!assert (isequal (y, stk_dataframe (3 * x.data, {'x' 'y'}, {'a'; 'b'; 'c'}))); %!test y = x * 3; %!assert (isequal (y, stk_dataframe (3 * x.data, {'x' 'y'}, {'a'; 'b'; 'c'}))); stk/inst/arrays/@stk_dataframe/ne.m0000644000000000000000000000205213156161544014515 0ustar % NE [overload base function] % Copyright Notice % % Copyright (C) 2017 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function y = ne (x1, x2) y = (double (x1) ~= double (x2)); end % function stk/inst/arrays/@stk_dataframe/not.m0000644000000000000000000000203013156161544014707 0ustar % NOT [overload base function] % Copyright Notice % % Copyright (C) 2017 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function y = not (x) y = ~ logical (x); end % function stk/inst/arrays/@stk_dataframe/openvar.m0000644000000000000000000000427313156161544015574 0ustar % OPENVAR [overload base function] % Copyright Notice % % Copyright (C) 2016 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function openvar (varname, x) try x_val = array2table (double (x)); x_val.Properties.RowNames = x.rownames; if ~ isempty (x.colnames) x_val.Properties.VariableNames = x.colnames; end x_name = sprintf ('%s__CONVERTED_TO_TABLE', varname); catch x_val = double (x); x_name = sprintf ('%s__CONVERTED_TO_DOUBLE', varname); end show_warning = stk_options_get ('stk_dataframe', 'openvar_warndlg'); if show_warning w_msg = sprintf (['Viewing the content of stk_dataframe objects in the ' ... 'Variable Editor directly is not possible.\n\n'... 'A temporary variable named %s will be now created in your base ' ... 'workspace, making it possible for you to explore the data ' ... 'contained in %s using the Variable Editor.\n\n' ... 'DO NOT EDIT this temporary variable, as the modifications will ' ... 'not be copied back to the original variable %s.\n\n' ... 'This warning will only be shown once per session.'], ... x_name, varname, varname); warndlg (w_msg, 'Converting stk_dataframe object', 'modal'); stk_options_set ('stk_dataframe', 'openvar_warndlg', false); end assignin ('base', x_name, x_val); openvar (x_name) endstk/inst/arrays/@stk_dataframe/or.m0000644000000000000000000000205313156161544014534 0ustar % OR [overload base function] % Copyright Notice % % Copyright (C) 2017 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function y = or (x1, x2) y = (logical (x1) | logical (x2)); end % function stk/inst/arrays/@stk_dataframe/plot.m0000644000000000000000000001654713156161544015107 0ustar % PLOT [overload base function] % Copyright Notice % % Copyright (C) 2015-2017 CentraleSupelec % Copyright (C) 2013, 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function h_plot = plot (varargin) % Parse the list of input arguments [h_axes, plot_elem, keyval_pairs] = parse_args_ (varargin{:}); % Read hold state b = ishold (); % Plot all n = length (plot_elem); h_plot = []; for i = 1:n p = plot_elem(i); hh = plot_ (h_axes, p.x, p.z, p.S, keyval_pairs{:}); h_plot = [h_plot; hh]; %#ok if (i == 1) && (n > 1), hold on; end end % Restore hold state if (~ b) && (n > 1), hold off; end end % function function h = plot_ (h_axes, x, z, S, varargin) %--- Handle stk_dataframe inputs ------------------------------------------ if isa (x, 'stk_dataframe') xlab = x.colnames; x = double (x); else xlab = {}; end if isa (z, 'stk_dataframe') zlab = z.colnames; z = double (z); else zlab = {}; end %--- Deal with various forms for x and z ---------------------------------- if isempty (x) % Special: x not provided % Tolerate row vector for z if isrow (z), z = z'; end % Create a default x x = (1:(size (z, 1)))'; else % General case % Tolerate row vector for x if isrow (x), x = x'; end % Number of points n = size (x, 1); % Tolerate row vector for z if isequal (size (z), [1 n]), z = z'; end end %--- Plot and set labels -------------------------------------------------- if isempty (S) h = plot (h_axes, x, z, varargin{:}); else h = plot (h_axes, x, z, S, varargin{:}); end if ~ isempty (xlab) if size (x, 2) == 1 stk_xlabel (xlab{1}, 'interpreter', 'none'); % CG#10 end % Note: in the case where x has several columns (and z also) we could % create more elaborate legends, e.g., "Zj versus Xj". Another time. end if ~ isempty (zlab) if size (z, 2) == 1 stk_ylabel (zlab{1}, 'interpreter', 'none'); % CG#10 else legend (zlab{:}); end end end % function %#ok<*SPWRN,*TRYNC> function [h_axes, plot_elem, keyval_pairs] = parse_args_ (varargin) % Plot is highly polymorphic, making the task of parsing input arguments a % rather lengthy and painful one... %--- Formal grammar for the list of arguments ----------------------------- % % Terminal symbols % % h = a handle to an axes object % x = abscissa argument % z = ordinate argument % S = symbol/color/line string argument % k = key in a key-val pair % v = value in a key-val pair % % Derivation rules % % ::= | h % ::= % ::= k v | k v % ::= | % ::= | % ::= | % ::= x z | x z S % ::= z | z S % Extract axis handle (if it is present) [h_axes, varargin, n_argin] = stk_plot_getaxesarg (varargin{:}); if n_argin == 0 stk_error ('Not enough input arguments.', 'NotEnoughInputArgs'); end % Extract first element from the list of arguments arg1 = varargin{1}; varargin(1) = []; % Then, arg1 *must* be a "numeric" argument if ischar (arg1) stk_error ('Syntax error. Unexpected string argument.', 'TypeMismatch'); end % Then, process remaining arguments recursively if isempty (varargin) % Special case: x has been omitted, and there are no additional args plot_elem = struct ('x', [], 'z', {arg1}, 'S', []); keyval_pairs = {}; elseif ischar (varargin{1}) % Special case: x has been omitted, and there *are* additional args if mod (length (varargin), 2) S = []; keyval_pairs = parse_keyval_ (varargin); else S = varargin{1}; keyval_pairs = parse_keyval_ (varargin{2:end}); end plot_elem = struct ('x', [], 'z', {arg1}, 'S', {S}); else % General case [plot_elem, keyval_pairs] = parse_args__ (arg1, varargin{:}); end end % function function [plot_elem, keyval_pairs] = parse_args__ (x, z, varargin) if ischar (x) || ischar (z) display (x); display (z); stk_error (['Syntax error. At this point, we were expecting ' ... 'another numeric (x, z) pair.'], 'SyntaxError'); end if isempty (varargin) plot_elem = struct ('x', {x}, 'z', {z}, 'S', []); keyval_pairs = {}; elseif ~ ischar (varargin{1}) % expect another (x, z) pair after this one plot_elem = struct ('x', {x}, 'z', {z}, 'S', []); [plot_elem_, keyval_pairs] = parse_args__ (varargin{:}); plot_elem = [plot_elem plot_elem_]; elseif length (varargin) == 1 % S plot_elem = struct ('x', {x}, 'z', {z}, 'S', varargin(1)); keyval_pairs = {}; elseif ischar (varargin{2}) % S, key, val, ... plot_elem = struct ('x', {x}, 'z', {z}, 'S', varargin(1)); keyval_pairs = parse_keyval_ (varargin{2:end}); elseif length (varargin) == 2 % key, val plot_elem = struct ('x', {x}, 'z', {z}, 'S', []); keyval_pairs = varargin; elseif ~ ischar (varargin{3}) % S, x, z, ... plot_elem = struct ('x', {x}, 'z', {z}, 'S', varargin(1)); [plot_elem_, keyval_pairs] = parse_args__ (varargin{2:end}); plot_elem = [plot_elem plot_elem_]; else % key, val, key, val, ... plot_elem = struct ('x', {x}, 'z', {z}, 'S', []); keyval_pairs = parse_keyval_ (varargin{:}); end end % function function keyval_pairs = parse_keyval_ (key, val, varargin) if nargin == 0 keyval_pairs = {}; elseif nargin == 1 errmsg = 'Syntax error. Incomplete key-value pair'; stk_error (errmsg, 'NotEnoughInputArgs'); elseif ~ ischar (key) display (key); stk_error (['Syntax error. At his point, we were expecting a ' ... 'key-value pair, but key is not a string.'], 'TypeMismatch'); else keyval_pairs = [{key, val} parse_keyval_(varargin{:})]; end end % function %!test % plot with x as a vector and z as a (univariate) dataframe %! x = linspace(0, 2*pi, 30)'; %! z = stk_dataframe(sin(x)); %! figure; plot(x, z); close(gcf); %!test % plot with x as a vector and z as a (multivariate) dataframe %! x = linspace(0, 2*pi, 30)'; %! z = stk_dataframe([sin(x) cos(x)], {'sin' 'cos'}); %! figure; plot(x, z); close(gcf); %!test % plot with x as a dataframe and z as a vector %! x = stk_dataframe(linspace(0, 2*pi, 30)'); %! z = sin(double(x)); %! figure; plot(x, z); close(gcf); stk/inst/arrays/@stk_dataframe/plotmatrix.m0000644000000000000000000000567313156161544016332 0ustar % @STK_DATAFRAME/PLOTMATRIX [overload base function] % % See also: plotmatrix % Copyright Notice % % Copyright (C) 2017 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function varargout = plotmatrix (varargin) % Parse the list of input arguments [h_axes, x, y, linespec] = parse_args_ (varargin{:}); % Read x argument if isa (x, 'stk_dataframe') x_data = double (x); x_colnames = x.colnames; else x_data = x; x_colnames = {}; end nx = size (x_data, 2); varargout = cell (1, max (nargout, 2)); if isempty (y) y_colnames = x_colnames; ny = nx; [varargout{:}] = plotmatrix (h_axes, x_data, linespec{:}); else % Read y argument if isa (y, 'stk_dataframe') y_data = double (y); y_colnames = y.colnames; else y_data = double (y); y_colnames = {}; end ny = size (y_data, 2); [varargout{:}] = plotmatrix (h_axes, x_data, y_data, linespec{:}); end hh = varargout{2}; varargout = varargout(1:nargout); if ~ isempty (x_colnames) for i = 1:nx stk_xlabel (hh(ny, i), x_colnames{i}, 'interpreter', 'none'); % CG#10 end end if ~ isempty (y_colnames) for j = 1:ny stk_ylabel (hh(j, 1), y_colnames{j}, 'interpreter', 'none'); % CG#10 end end end % function function [h_axes, x, y, linespec] = parse_args_ (varargin) % Extract axis handle (if it is present) [h_axes, varargin, n_argin] = stk_plot_getaxesarg (varargin{:}); switch n_argin case 0 stk_error ('Not enough input arguments.', 'NotEnoughInputArgs'); case 1 x = varargin{1}; y = []; linespec = {}; case 2 if ischar (varargin{2}) x = varargin{1}; y = []; linespec = varargin(2); else x = varargin{1}; y = varargin{2}; linespec = {}; end case 3 x = varargin{1}; y = varargin{2}; linespec = varargin(3); otherwise stk_error ('Too many input arguments.', 'TooManyInputArgs'); end % switch end % function stk/inst/arrays/@stk_dataframe/plus.m0000644000000000000000000000231313156161544015076 0ustar % PLUS [overload base function] % Copyright Notice % % Copyright (C) 2013 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function y = plus(x1, x2) y = bsxfun(@plus, x1, x2); end % function %!test stk_test_dfbinaryop(@plus, rand(7, 2), rand(7, 2)); %!test stk_test_dfbinaryop(@plus, rand(7, 2), pi); %!error stk_test_dfbinaryop(@plus, rand(7, 2), rand(7, 3)); stk/inst/arrays/@stk_dataframe/power.m0000644000000000000000000000233213156161544015250 0ustar % POWER [overload base function] % Copyright Notice % % Copyright (C) 2013 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function y = power(x1, x2) y = bsxfun(@power, x1, x2); end % function %!test stk_test_dfbinaryop(@power, rand(7, 2), .1 + rand(7, 2)); %!test stk_test_dfbinaryop(@power, rand(7, 2), .1); %!error stk_test_dfbinaryop(@power, rand(7, 2), .1 + rand(7, 3)); stk/inst/arrays/@stk_dataframe/private/0000755000000000000000000000000013156161544015410 5ustar stk/inst/arrays/@stk_dataframe/private/get_column_number.m0000644000000000000000000000215313156161544021273 0ustar % GET_COLUMN_NUMBER [STK internal] % Copyright Notice % % Copyright (C) 2013 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . % Do NOT remove this seemingly useless M-file, otherwise some not-so-old % versions of Octave would faild to detect the corresponding mex-file. stk/inst/arrays/@stk_dataframe/private/names_errmsg.m0000644000000000000000000000254413156161544020255 0ustar % NAMES_ERRMSG [STK internal] % Copyright Notice % % Copyright (C) 2015 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function [s, mnemo] = names_errmsg (n1, n2, type) mnemo = sprintf ('Unknown%sNames', type); type = lower (type); s = 'Invalid indexing'; if any (~ cellfun (@ischar, n1)), s = sprintf ('%s: %s names must be character arrays (char).', s, type); else i = find (~ ismember (n1, n2), 1, 'first'); s = sprintf ('%s: there is no %s named %s.', s, type, n1{i}); end end % function stk/inst/arrays/@stk_dataframe/private/process_cell_indices.m0000644000000000000000000000242213156161544021741 0ustar % PROCESS_CELL_INDICES [STK internal] % Copyright Notice % % Copyright (C) 2015 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function I = process_cell_indices (I, name_list, type) % assert (iscell (I)) % no argument checking in private functions names = I; [b, I] = ismember (names, name_list); if ~ all (b) [errmsg, mnemo] = names_errmsg (names, name_list, type); stk_error (errmsg, mnemo); end end % function stk/inst/arrays/@stk_dataframe/private/process_char_indices.m0000644000000000000000000000241313156161544021737 0ustar % PROCESS_CHAR_INDICES [STK internal] % Copyright Notice % % Copyright (C) 2015 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function I = process_char_indices (I, name_list, type) % assert (ischar (I)) % no argument checking in private functions name = I; [b, I] = ismember (name, name_list); if ~ b [errmsg, mnemo] = names_errmsg ({name}, name_list, type); stk_error (errmsg, mnemo); end end % function stk/inst/arrays/@stk_dataframe/private/reserved_field_names.m0000644000000000000000000000211013156161544021725 0ustar % RESERVED_FIELD_NAMES [STK internal] % Copyright Notice % % Copyright (C) 2013, 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function c = reserved_field_names () c = {'data', 'info', 'rownames', 'colnames'}; end % function stk/inst/arrays/@stk_dataframe/prod.m0000644000000000000000000000242413156161544015062 0ustar % PROD [overload base function] % Copyright Notice % % Copyright (C) 2013 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function z = prod(x, dim) if nargin < 2, dim = 1; end z = apply(x, dim, @prod); end % function %!shared x1, df1 %! x1 = rand(9, 3); %! df1 = stk_dataframe(x1, {'a', 'b', 'c'}); %!assert (isequal (prod(df1), prod(x1))) %!assert (isequal (prod(df1, 1), prod(x1))) %!assert (isequal (prod(df1, 2), prod(x1, 2))) stk/inst/arrays/@stk_dataframe/quantile.m0000644000000000000000000000255513156161544015745 0ustar % QUANTILE [overload base function] % Copyright Notice % % Copyright (C) 2013 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function z = quantile (x, p, dim) if nargin < 3, dim = 1; end z = apply (x, dim, @quantile, p); end % function %!shared x1, df1, p %! x1 = rand (9, 3); %! df1 = stk_dataframe (x1, {'a', 'b', 'c'}); %! p = 0.95; %!assert (isequal (quantile (df1, p), quantile (x1, p))) %!assert (isequal (quantile (df1, p, 1), quantile (x1, p))) %!assert (isequal (quantile (df1, p, 2), quantile (x1, p, 2))) stk/inst/arrays/@stk_dataframe/rdivide.m0000644000000000000000000000234413156161544015545 0ustar % RDIVIDE [overload base function] % Copyright Notice % % Copyright (C) 2013 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function y = rdivide(x1, x2) y = bsxfun(@rdivide, x1, x2); end % function %!test stk_test_dfbinaryop(@rdivide, rand(7, 2), 1 + rand(7, 2)); %!test stk_test_dfbinaryop(@rdivide, rand(7, 2), pi); %!error stk_test_dfbinaryop(@rdivide, rand(7, 2), 1 + rand(7, 3)); stk/inst/arrays/@stk_dataframe/realpow.m0000644000000000000000000000234613156161544015572 0ustar % REALPOW [overload base function] % Copyright Notice % % Copyright (C) 2013 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function y = realpow(x1, x2) y = bsxfun(@realpow, x1, x2); end % function %!test stk_test_dfbinaryop(@realpow, rand(7, 2), .1 + rand(7, 2)); %!test stk_test_dfbinaryop(@realpow, rand(7, 2), .1); %!error stk_test_dfbinaryop(@realpow, rand(7, 2), .1 + rand(7, 3)); stk/inst/arrays/@stk_dataframe/reshape.m0000644000000000000000000000267213156161544015552 0ustar % RESHAPE [overload base function] % % Note : the result of reshaping a dataframe is again a dataframe, but all row % and columns names are lost in the process. % Copyright Notice % % Copyright (C) 2013 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function y = reshape (x, varargin) % Silently assume that x is a dataframe % (this can go wrong if a dataframe is hidden in varargin, but hey...) y = stk_dataframe (reshape (x.data, varargin{:})); end % function %!test %! x = stk_dataframe (randn (10, 3)); %! y = reshape (x, 5, 6); %! assert (isa (y, 'stk_dataframe') && isequal (size (y), [5 6])) stk/inst/arrays/@stk_dataframe/set.m0000644000000000000000000000634513156161544014717 0ustar % SET [overload base function] % Copyright Notice % % Copyright (C) 2015, 2017 CentraleSupelec % Copyright (C) 2013 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function x = set (x, propname, value) icol = __get_column_number__ (x.colnames, propname); switch icol case -4 % 'info' x.info = value; case -3 % 'rownames' if isempty (value) x.rownames = {}; else n1 = size (x.data, 1); n2 = length (value); if ~ iscell (value) stk_error (['Input argument ''value'' should be a cell' ... ' array.'], 'InvalidArgument'); elseif isequal (size (value), [n2 1]) x.rownames = value; else x.rownames = reshape (value, n2, 1); end b = cellfun (@isempty, x.rownames); nb = sum (b); if nb > 0 x.rownames(b) = repmat ({''}, nb, 1); end if n2 < n1 x.rownames = [x.rownames; repmat({''}, n1 - n2, 1)]; elseif n2 > n1 x.data = [x.data; nan(n2 - n1, size(x.data, 2))]; end end case -2 % 'colnames' if isempty (value) x.colnames = {}; else d1 = size (x.data, 2); d2 = length (value); if ~ iscell (value) stk_error (['Input argument ''value'' should be a cell' ... ' array.'], 'InvalidArgument'); elseif isequal (size (value), [1 d2]) x.colnames = value; else x.colnames = reshape (value, 1, d2); end b = cellfun (@isempty, x.colnames); nb = sum (b); if nb > 0 x.colnames(b) = repmat ({''}, 1, nb); end if d2 < d1 x.colnames = [x.colnames repmat({''}, 1, d1 - d2)]; elseif d2 > d1 x.data = [x.data nan(size(x.data, 1), d2 - d1)]; end end case - 1 % set entire array x = set_data (x, value); otherwise if isequal (size(value), [size(x.data, 1) 1]) x.data(:, icol) = value; else error ('Incorrect size'); end end end % function stk/inst/arrays/@stk_dataframe/set_data.m0000644000000000000000000000344413156161544015705 0ustar % @STK_DATAFRAME/SET_DATA [STK internal] % Copyright Notice % % Copyright (C) 2015, 2017 CentraleSupelec % Copyright (C) 2013 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function x = set_data (x, data) [n1, d1] = size (x.data); [n2, d2] = size (data); x.data = data; if (n1 ~= n2) && ~ isempty (x.rownames) if n2 > n1 % silently add rows without a name x.rownames = [x.rownames; repmat({''}, n2 - n1, 1)]; else % delete superfluous row names and emit a warning x.rownames = x.rownames(1:n2); warning ('Some row names have been deleted.'); end end if (d1 ~= d2) && ~ isempty (x.colnames) if d2 > d1 % silently add columns without a name x.colnames = [x.colnames; repmat({''}, 1, d2 - d1)]; else % delete superfluous column names and emit a warning x.colnames = x.colnames(1:d2); warning ('Some column names have been deleted.'); end end end % function stk/inst/arrays/@stk_dataframe/sin.m0000644000000000000000000000223313156161544014705 0ustar % SIN [overload base function] % Copyright Notice % % Copyright (C) 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function ydata = sin (x) ydata = sin (x.data); end % function %!test %! u = rand (4, 3); x = stk_dataframe (u); v = sin (x); %! assert (strcmp (class (v), class (u)) && isequal (v, sin (u))) stk/inst/arrays/@stk_dataframe/sind.m0000644000000000000000000000224013156161544015047 0ustar % SIND [overload base function] % Copyright Notice % % Copyright (C) 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function ydata = sind (x) ydata = sind (x.data); end % function %!test %! u = rand (4, 3); x = stk_dataframe (u); v = sind (x); %! assert (strcmp (class (v), class (u)) && isequal (v, sind (u))) stk/inst/arrays/@stk_dataframe/sinh.m0000644000000000000000000000224013156161544015053 0ustar % SINH [overload base function] % Copyright Notice % % Copyright (C) 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function ydata = sinh (x) ydata = sinh (x.data); end % function %!test %! u = rand (4, 3); x = stk_dataframe (u); v = sinh (x); %! assert (strcmp (class (v), class (u)) && isequal (v, sinh (u))) stk/inst/arrays/@stk_dataframe/size.m0000644000000000000000000000263613156161544015075 0ustar % SIZE [overload base function] % Copyright Notice % % Copyright (C) 2013 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function varargout = size(x, varargin) varargout = cell(1, max(nargout, 1)); [varargout{:}] = size(x.data, varargin{:}); end % function %!shared x %! x = stk_dataframe([1 2; 3 4; 5 6]); %!assert (isequal (size(x), [3 2])) %!assert (numel(x) == 1) %!assert (ndims(x) == 2) %!test size(x); % force exploration of branch nargout == 0 % Note: numel MUST return 1 and not prod(size(x)) % http://www.mathworks.fr/support/solutions/en/data/1-19EZ0/?1-19EZ0 stk/inst/arrays/@stk_dataframe/sort.m0000644000000000000000000000540013156161544015102 0ustar % SORT [overload base] % Copyright Notice % % Copyright (C) 2015 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function [x, i] = sort (x, dim, mode) if ~ isa (x, 'stk_dataframe'), % Not what we expect: dim or mode is an stk_dataframe... stk_error ('x should be an stk_dataframe object here.', 'TypeMismatch'); end if (nargin < 2) || (isempty (dim)), % Sort along the first non-singleton dimension if (size (x.data, 1) > 1) dim = 1; else dim = 2; end elseif ~ ((dim == 1) || (dim == 2)) stk_error ('dim sould be 1 or 2.', 'InvalidArgument'); end if nargin < 3, mode = 'ascend'; end if dim == 1, % Sort columns [x.data, i] = sort (x.data, 1, mode); if (size (x.data, 2) > 1) % Row names are lost when sorting a dataframe with more than one column x.rownames = {}; elseif ~ isempty (x.rownames) x.rownames = x.rownames(i); end else % Sort rows [x.data, i] = sort (x.data, 2, mode); if (size (x.data, 1) > 1) % Column names are lost when sorting a dataframe with more than one row x.colnames = {}; elseif ~ isempty (x.colnames) x.colnames = x.colnames(i); end end end % function %!shared x, y %! x = stk_dataframe ([3; 2; 1], {}, {'a', 'b', 'c'}); %! y = sort (x); %!assert (strcmp (class (y), 'stk_dataframe')) %!assert (isequal (y.data, [1; 2; 3])) %!assert (isequal (y.rownames, {'c'; 'b'; 'a'})) %!assert (isequal (sort (x, []), y)) %!assert (isequal (sort (x, 1), y)) %!assert (isequal (sort (x, 2), x)) %!error sort (x, 3) %!assert (isequal (sort (x, [], 'ascend'), y)) %!assert (isequal (sort (x, 1, 'ascend'), y)) %!assert (isequal (sort (x, 2, 'ascend'), x)) %!error sort (x, 3, 'ascend') %!assert (isequal (sort (x, [], 'descend'), x)) %!assert (isequal (sort (x, 1, 'descend'), x)) %!assert (isequal (sort (x, 2, 'descend'), x)) %!error sort (x, 3, 'descend') stk/inst/arrays/@stk_dataframe/sqrt.m0000644000000000000000000000224013156161544015103 0ustar % SQRT [overload base function] % Copyright Notice % % Copyright (C) 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function ydata = sqrt (x) ydata = sqrt (x.data); end % function %!test %! u = rand (4, 3); x = stk_dataframe (u); v = sqrt (x); %! assert (strcmp (class (v), class (u)) && isequal (v, sqrt (u))) stk/inst/arrays/@stk_dataframe/std.m0000644000000000000000000000301413156161544014704 0ustar % STD [overload base function] % Copyright Notice % % Copyright (C) 2013 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function z = std(x, flag, dim) if nargin < 2, flag = 0; end % default: normalize by N-1 if nargin < 3, dim = 1; end % default: act along columns z = apply(x, dim, @std, flag); end % function %!shared x1, df1 %! x1 = rand(9, 3); %! df1 = stk_dataframe(x1, {'a', 'b', 'c'}); %!assert (isequal (std(df1), std(x1))) %!assert (isequal (std(df1, 0, 1), std(x1))) %!assert (isequal (std(df1, 0, 2), std(x1, 0, 2))) %!assert (isequal (std(df1, 1), std(x1, 1))) %!assert (isequal (std(df1, 1, 1), std(x1, 1))) %!assert (isequal (std(df1, 1, 2), std(x1, 1, 2))) stk/inst/arrays/@stk_dataframe/stk_boundingbox.m0000644000000000000000000000266013156161544017317 0ustar % STK_BOUNDINGBOX [overload STK function] % Copyright Notice % % Copyright (C) 2015 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function box = stk_boundingbox (x) if nargin > 1, stk_error ('Too many input arguments.', 'TooManyInputArgs'); end box = stk_boundingbox (x.data); box.colnames = x.colnames; end % function %!shared x, y, cn %! cn = {'a', 'b', 'c'}; %! x = stk_dataframe ([0 3 2; 1 4 1; 7 0 2], cn); %!error y = stk_boundingbox (); %!test y = stk_boundingbox (x); %!error y = stk_boundingbox (x, 1); %!assert (isequal (y, stk_hrect ([0 0 1; 7 4 2], cn))); stk/inst/arrays/@stk_dataframe/stk_conditioning.m0000644000000000000000000000476113156161544017471 0ustar % STK_CONDITIONING [overload STK function] % Copyright Notice % % Copyright (C) 2015 CentraleSupelec % % Authors: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function zsimc = stk_conditioning (lambda, zi, zsim, xi_ind, noise_sim) if nargin > 5, stk_error ('Too many input arguments.', 'TooManyInputArgs'); end df_out = false; % stk_dataframe output ? % Read 'lambda' argument if isa (lambda, 'stk_dataframe') lambda_ = lambda.data; rownames = lambda.colnames; df_out = true; else lambda_ = lambda; rownames = {}; end % Read 'zi' argument if isa (zi, 'stk_dataframe') zi_ = zi.data; else zi_ = zi; end % Read 'zsim' argument if isa (zsim, 'stk_dataframe') zsim_ = zsim.data; colnames = zsim.colnames; if isempty (rownames), rownames = zsim.rownames; elseif ~ isequal (zsim.rownames, rownames) rownames = {}; end df_out = true; else zsim_ = zsim; colnames = {}; end if nargin < 4, zsimc = stk_conditioning (lambda_, zi_, zsim_); else % nargin >= 4 % Read 'xi_ind' argument if isa (xi_ind, 'stk_dataframe') xi_ind_ = xi_ind.data; else xi_ind_ = xi_ind; end if nargin < 5, zsimc = stk_conditioning (lambda_, zi_, zsim_, xi_ind_); else % nargin >= 5 % Read 'noise_sim' argument if isa (noise_sim, 'stk_dataframe'), noise_sim_ = noise_sim.data; else noise_sim_ = noise_sim; end zsimc = stk_conditioning (lambda_, zi_, zsim_, xi_ind_, noise_sim_); end end if df_out, zsimc = stk_dataframe (zsimc, colnames, rownames); end end % function stk/inst/arrays/@stk_dataframe/stk_dataframe.m0000644000000000000000000002335513156161544016731 0ustar % STK_DATAFRAME constructs a dataframe object % % CALL: D = stk_dataframe (X) % % constructs a dataframe object from X. If X is a plain numeric array, then % D is dataframe without row or column names. If X already is an % stk_dataframe object, row names and column names are preserved when they % exist. % % CALL: D = stk_dataframe (X, COLNAMES) % % allows to specify column names for the dataframe D. Row names from X are % preserved when they exist. % % If COLNAMES is empty ([]), this is equivalent to D = stk_dataframe (X); % in particular, if X has column names, then D inherits from them. % % If COLNAMES is an empty cell({}), the resulting dataframe has no column % names. % % CALL: D = stk_dataframe (X, COLNAMES, ROWNAMES) % % allows to specify row names as well. % % If ROWNAMES is empty ([]), this is equivalent to D = stk_dataframe (X, % COLNAMES); in particular, if X has row names, then D inherits from them. % % If ROWNAMES is an empty cell({}), the resulting dataframe has no row names. % % See also: stk_factorialdesign, stk_hrect % Copyright Notice % % Copyright (C) 2015, 2017 CentraleSupelec % Copyright (C) 2013 SUPELEC % % Authors: Julien Bect % Emmanuel Vazquez % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function x = stk_dataframe (x, colnames, rownames) if nargin > 3 stk_error ('Too many input arguments.', 'TooManyInputArgs'); elseif nargin == 0 % Default constructor x_data = zeros (0, 1); colnames = {}; rownames = {}; elseif isa (x, 'stk_dataframe') if strcmp (class (x), 'stk_dataframe') %#ok if nargin > 1 if iscell (colnames) x = set (x, 'colnames', colnames); elseif ~ isempty (colnames) stk_error (['colnames should be either a cell array ' ... 'of strings or [].'], 'InvalidArgument'); % Note: [] means "keep x.colnames" % while {} means "no column names" end if nargin > 2 if iscell (rownames) x = set (x, 'rownames', rownames); elseif ~ isempty (rownames) stk_error (['rownames should be either a cell array ' ... 'of strings or [].'], 'InvalidArgument'); % Note: [] means "keep x.rownames" % while {} means "no row names" end end end return % We already have an stk_dataframe object else % x belongs to a derived class x_data = x.data; if nargin == 1 colnames = x.colnames; rownames = x.rownames; else % nargin > 1, % colnames = [] means "keep x.colnames" if isempty (colnames) && ~ iscell (colnames) colnames = x.colnames; end % rownames missing or [] means "keep x.rownames" if (nargin == 2) || (isempty (rownames) && ~ iscell (rownames)) rownames = x.rownames; end end end else % Assume x is (or can be converted to) numeric data x_data = double (x); if nargin < 3 rownames = {}; if nargin < 2 colnames = {}; end end end if isempty (x_data) % Process colnames argument if isempty (colnames) d = 0; colnames = {}; elseif iscell (colnames) d = numel (colnames); colnames = reshape (colnames, 1, d); else stk_error ('colnames should be a cell array', 'TypeMismatch'); end % Process rownames argument if isempty (rownames) n = 0; rownames = {}; elseif iscell (rownames) n = numel (rownames); rownames = reshape (rownames, n, 1); else stk_error ('rownames should be a cell array', 'TypeMismatch'); end x_data = zeros (n, d); else [n, d] = size (x_data); % Process colnames argument if isempty (colnames) colnames = {}; elseif iscell (colnames) && numel (colnames) == d colnames = reshape (colnames, 1, d); elseif ischar (colnames) && d == 1 colnames = {colnames}; else stk_error (['colnames should be a cell array with d elements, ' ... 'where d is the number of columns of the dataframe'], 'IncorrectSize'); end % Process rownames argument if isempty (rownames) rownames = {}; elseif iscell (rownames) && numel (rownames) == n rownames = reshape (rownames, n, 1); elseif ischar (rownames) && n == 1 rownames = {rownames}; else stk_error (['rownames should be a cell array with n elements, ' ... 'where n is the number of rows of the dataframe'], 'IncorrectSize'); end end x = struct (); x.data = x_data; x.colnames = colnames; x.rownames = rownames; x.info = ''; x = class (x, 'stk_dataframe'); end % function %!test stk_test_class ('stk_dataframe') %!error x = stk_dataframe (1, {}, {}, pi); %!test % default constructor %! x = stk_dataframe (); %! assert (isa (x, 'stk_dataframe') && isequal (size (x), [0 0])) %!test %! y = stk_dataframe (rand (3, 2)); %! assert (isa (y, 'stk_dataframe') && isequal (size (y), [3 2])) %!test %! y = stk_dataframe (rand (3, 2), {'x', 'y'}); %! assert (isa (y, 'stk_dataframe') && isequal (size(y), [3 2])) %! assert (isequal (y.colnames, {'x' 'y'})) %!test %! y = stk_dataframe (rand (3, 2), {'x', 'y'}, {'a', 'b', 'c'}); %! assert (isa (y, 'stk_dataframe') && isequal (size (y), [3 2])) %! assert (isequal (y.colnames, {'x' 'y'})) %! assert (isequal (y.rownames, {'a'; 'b'; 'c'})) %!test %! x = stk_dataframe (rand (3, 2)); %! y = stk_dataframe (x); %! assert (isa (y, 'stk_dataframe') && isequal (size (y), [3 2])) %!error %! x = stk_dataframe (rand (3, 2)); %! y = stk_dataframe (x, pi); %!error %! x = stk_dataframe (rand (3, 2)); %! y = stk_dataframe (x, {}, pi); %!test %! x = stk_dataframe (rand (3, 2)); %! y = stk_dataframe (x, {'x' 'y'}); %! assert (isa (y, 'stk_dataframe') && isequal (size(y), [3 2])) %! assert (isequal (y.colnames, {'x' 'y'})) %!test %! x = stk_dataframe (rand (3, 2)); %! y = stk_dataframe (x, {'x' 'y'}, {'a', 'b', 'c'}); %! assert (isa (y, 'stk_dataframe') && isequal (size(y), [3 2])) %! assert (isequal (y.colnames, {'x' 'y'})) %! assert (isequal (y.rownames, {'a'; 'b'; 'c'})) %!test %! x = stk_dataframe (rand (3, 2), {'x' 'y'}); %! y = stk_dataframe (x, [], {'a', 'b', 'c'}); %! assert (isa (y, 'stk_dataframe') && isequal (size(y), [3 2])) %! assert (isequal (y.colnames, {'x' 'y'})) %! assert (isequal (y.rownames, {'a'; 'b'; 'c'})) %!test %! x = stk_dataframe (rand (3, 2), {'x' 'y'}); %! y = stk_dataframe (x, {}, {'a', 'b', 'c'}); %! assert (isa (y, 'stk_dataframe') && isequal (size(y), [3 2])) %! assert (isequal (y.colnames, {})) %! assert (isequal (y.rownames, {'a'; 'b'; 'c'})) %!test %! x = stk_factorialdesign ({1:3, 1:2}, {'x' 'y'}); %! y = stk_dataframe (x, [], {'a' 'b' 'c' 'd' 'e' 'f'}); %! assert (isa (y, 'stk_dataframe') && isequal (size (y), [6 2])) %! assert (isequal (y.colnames, {'x' 'y'})) %! assert (isequal (y.rownames, {'a'; 'b'; 'c'; 'd'; 'e'; 'f'})) %!test %! x = stk_factorialdesign ({1:3, 1:2}, {}, {'a' 'b' 'c' 'd' 'e' 'f'}); %! y = stk_dataframe (x, {'x' 'y'}); %! assert (isa (y, 'stk_dataframe') && isequal (size (y), [6 2])) %! assert (isequal (y.colnames, {'x' 'y'})) %! assert (isequal (y.rownames, {'a'; 'b'; 'c'; 'd'; 'e'; 'f'})) %!test %! x = stk_factorialdesign ({1:3, 1:2}, {}, {'a' 'b' 'c' 'd' 'e' 'f'}); %! y = stk_dataframe (x, {'x' 'y'}, []); %! assert (isa (y, 'stk_dataframe') && isequal (size (y), [6 2])) %! assert (isequal (y.colnames, {'x' 'y'})) %! assert (isequal (y.rownames, {'a'; 'b'; 'c'; 'd'; 'e'; 'f'})) %!test %! x = stk_factorialdesign ({1:3, 1:2}, {'x' 'y'}, {'a' 'b' 'c' 'd' 'e' 'f'}); %! y = stk_dataframe (x); %! assert (isa (y, 'stk_dataframe') && isequal (size (y), [6 2])) %! assert (isequal (y.colnames, {'x' 'y'})) %! assert (isequal (y.rownames, {'a'; 'b'; 'c'; 'd'; 'e'; 'f'})) %!error %! x = stk_factorialdesign ({1:3, 1:2}); %! y = stk_dataframe (x, pi); %!error %! x = stk_factorialdesign ({1:3, 1:2}); %! y = stk_dataframe (x, {}, pi); %!test %! x = stk_dataframe ([], {'a', 'b'}); %! assert (isequal (size (x), [0 2])) %! assert (isequal (x.colnames, {'a' 'b'})); %! assert (isequal (x.rownames, {})); %!test %! x = stk_dataframe ([], {'a', 'b'}, {'toto'}); %! assert (isequal (size (x), [1 2])) %! assert (isequal (x.colnames, {'a' 'b'})); %! assert (isequal (x.rownames, {'toto'})); % Check that we tolerate char arguments for colnames/rownames %!test %! x = stk_dataframe (randn (10, 1), 'NOx'); %! assert (isequal (x.colnames, {'NOx'})); %!test %! x = stk_dataframe (randn (1, 2), {}, 'aaa'); %! assert (isequal (x.rownames, {'aaa'})); stk/inst/arrays/@stk_dataframe/stk_length.m0000644000000000000000000000230713156161544016260 0ustar % STK_LENGTH [overload STK function] % Copyright Notice % % Copyright (C) 2014 SUPELEC % % Authors: Julien Bect % Emmanuel Vazquez % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function l = stk_length (x) l = size (x.data, 1); end % function %!test %! x = stk_dataframe ([1 2; 3 4; 5 6]); %! assert (isequal (stk_length (x), 3)); stk/inst/arrays/@stk_dataframe/stk_normalize.m0000644000000000000000000000352513156161544017002 0ustar % STK_NORMALIZE [overload STK function] % Copyright Notice % % Copyright (C) 2013, 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function [x, a, b] = stk_normalize (x, box) if nargin > 2, stk_error ('Too many input arguments.', 'TooManyInputArgs'); end if nargin < 2, box = []; end if isa (x, 'stk_dataframe') % Ensure that box is an stk_hrect object if ~ isa (box, 'stk_hrect') if isempty (box), box = stk_boundingbox (x.data); % Default: bounding box else box = stk_hrect (box); end end % Call @stk_hrect/stk_normalize [x.data, a, b] = stk_normalize (x.data, box); else % box is an stk_dataframe object % Call @stk_hrect/stk_normalize [x, a, b] = stk_normalize (x, stk_hrect (box)); end % if end % function %!test %! u = rand (6, 2) * 2; %! x = stk_dataframe (u); %! y = stk_normalize (x); %! assert (isa (y, 'stk_dataframe') ... %! && stk_isequal_tolabs (double (y), stk_normalize (u))) stk/inst/arrays/@stk_dataframe/stk_rescale.m0000644000000000000000000000313713156161544016417 0ustar % STK_RESCALE [overload STK function] % Copyright Notice % % Copyright (C) 2012-2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function [x, a, b] = stk_rescale (x, box1, varargin) % Ensure that box1 is an stk_hrect object if ~ isa (box1, 'stk_hrect') if isempty (box1) box1 = stk_hrect (size (x, 2)); % Default: [0; 1] ^ DIM else box1 = stk_hrect (box1); end end % Rescale using @stk_hrect/stk_rescale if isa (x, 'stk_dataframe') [x.data, a, b] = stk_rescale (x.data, box1, varargin{:}); else [x, a, b] = stk_rescale (x, box1, varargin{:}); end end % function %!test %! u = rand(5, 1) * 2; %! x = stk_dataframe(u); %! y = stk_rescale(x, [0; 2], [0; 3]); %! assert (isa (y, 'stk_dataframe') && isequal(double(y), u * 3/2)) stk/inst/arrays/@stk_dataframe/stk_sprintf.m0000644000000000000000000001175113156161544016467 0ustar % STK_PRINTF [overload STK function] % Copyright Notice % % Copyright (C) 2015, 2017 CentraleSupelec % Copyright (C) 2013, 2014 SUPELEC % % Authors: Julien Bect % Emmanuel Vazquez % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function s = stk_sprintf (x, verbosity, data_col_width) if (nargin < 2) || (isempty (verbosity)) verbosity = stk_options_get ('stk_dataframe', 'disp_format'); end if ~ ismember (verbosity, {'basic', 'verbose'}) errmsg = 'verbosity should be ''basic'' or ''verbose''.'; stk_error (errmsg, 'InvalidArgument'); end if (nargin < 3) || (isempty (data_col_width)) data_col_width = []; end if isempty (x) spstr = stk_options_get ('stk_dataframe', 'disp_spstr'); if strcmp (verbosity, 'verbose') s = char (... '.colnames =', horzcat (spstr, stk_sprintf_colnames (x)), ... '.rownames =', horzcat (spstr, stk_sprintf_rownames (x)), ... '.data =', horzcat (spstr, '<', stk_sprintf_sizetype (x.data), '>')); else [n, d] = size (x); s = sprintf ('Empty data frame with %d rows and %d columns', n, d); if d > 0 && ~ isempty (x.colnames) s = char (s, ... sprintf (' with .colnames = %s', stk_sprintf_colnames (x))); elseif n > 0 && ~ isempty (x.rownames) s = char (s, ... sprintf (' with .rownames = %s', stk_sprintf_rownames (x))); end end else % x is not empty s = sprintf_table_ (x.data, x.colnames, x.rownames, data_col_width); if strcmp (verbosity, 'verbose') spstr = stk_options_get ('stk_dataframe', 'disp_spstr'); s = char (... '.colnames =', horzcat (spstr, stk_sprintf_colnames (x)), ... '.rownames =', horzcat (spstr, stk_sprintf_rownames (x)), ... '.data =', horzcat (repmat (spstr, size (s, 1), 1), s)); elseif isempty (s) disp toto end end end % function %#ok<*CTCH> function s = sprintf_table_ (x, colnames, rownames, data_col_width) x = double (x); [n, d] = size (x); if (n == 0) || (d == 0) s = '[] (empty)'; else if (nargin < 2) || isempty (data_col_width) switch stk_disp_getformat () case 'short' data_col_width = 8; case 'long' data_col_width = 16; otherwise % FIXME: handle other formatting modes... data_col_width = 8; end end % column names if (nargin < 3) || isempty (colnames) colnames = repmat ({''}, 1, d); end % row names if (nargin < 4) || isempty (rownames) rownames = repmat ({''}, n, 1); end b = cellfun (@isempty, rownames); rownames(b) = repmat({'*'}, sum (b), 1); rownames = fliplr (char (cellfun ... (@fliplr, rownames, 'UniformOutput', false))); nb_spaces_colsep = 2; nb_rows = n + 1; % + 1 for the header s = repmat ('', nb_rows, 1); %#ok<*AGROW> s = [s [repmat(' ', 1, size(rownames, 2)); rownames]]; % column separator between row names and the first data column s = [s repmat(' :', nb_rows, 1) ... repmat(' ', nb_rows, nb_spaces_colsep)]; for j = 1:d xx = stk_sprintf_colvect (x(:, j), data_col_width); Lxx = size (xx, 2); vn = colnames{j}; if isempty (vn) vn = repmat('-', 1, Lxx); end L = max (length (vn), Lxx); s = [s [sprintf('% *s', L, vn); % variable name repmat(' ', n, L - Lxx) xx]]; % formatted data if j < d % column separator s = [s repmat(' ', nb_rows, nb_spaces_colsep)]; end end % for end % if end % function %!shared x, fmt %! fmt = stk_disp_getformat (); %! x = stk_dataframe (rand (3, 2)); %!test format rat; disp (x); %!test format long; disp (x); %!test format short; disp (x); format (fmt); %!test disp (stk_dataframe (zeros (0, 1))) %!test disp (stk_dataframe (zeros (0, 2))) stk/inst/arrays/@stk_dataframe/stk_sprintf_colnames.m0000644000000000000000000000262313156161544020346 0ustar % STK_SPRINTF_COLNAMES returns the column names of an array % Copyright Notice % % Copyright (C) 2013 SUPELEC % % Authors: Julien Bect % Emmanuel Vazquez % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function s = stk_sprintf_colnames (x) d = size (x, 2); colnames = get (x, 'colnames'); if isempty (colnames) s = stk_sprintf_colnames (zeros (0, d)); else s = '{'; for j = 1:(d-1), s = [s sprintf('''%s'', ', x.colnames{j})]; %#ok end s = [s sprintf('''%s''}', x.colnames{end})]; end end % function stk/inst/arrays/@stk_dataframe/stk_sprintf_rownames.m0000644000000000000000000000262013156161544020375 0ustar % STK_SPRINTF_ROWNAMES returns the row names of an array % Copyright Notice % % Copyright (C) 2013 SUPELEC % % Authors: Julien Bect % Emmanuel Vazquez % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function s = stk_sprintf_rownames (x) n = size (x, 1); rownames = get (x, 'rownames'); if isempty (rownames) s = stk_sprintf_rownames (zeros (n, 0)); else s = '{'; for j = 1:(n-1), s = [s sprintf('''%s''; ', x.rownames{j})]; %#ok end s = [s sprintf('''%s''}', x.rownames{end})]; end end % function stk/inst/arrays/@stk_dataframe/stk_sprintf_sizetype.m0000644000000000000000000000230713156161544020420 0ustar % STK_SPRINTF_SIZETYPE prints the size and type into a string % Copyright Notice % % Copyright (C) 2013, 2014 SUPELEC % % Authors: Julien Bect % Emmanuel Vazquez % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function s = stk_sprintf_sizetype (x) [n, d] = size (x); s = sprintf ('%dx%d %s array', n, d, class (x)); end % function stk/inst/arrays/@stk_dataframe/subsasgn.m0000644000000000000000000003242713156161544015751 0ustar % SUBSASGN [overload base function] % Copyright Notice % % Copyright (C) 2015, 2017 CentraleSupelec % Copyright (C) 2013, 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function x = subsasgn(x, idx, val) if ~ isa (x, 'stk_dataframe') if isempty (x) % this is required to support B(idx) = D if B does not exist and D is % an stk_dataframe (which, in turn, is required to make repmat work...) x_data = subsasgn ([], idx, val.data); x = stk_dataframe (x_data); else % we're assigning a dataframe (val) to something else x = subsasgn(x, idx, val.data); end return end switch idx(1).type case '()' if length(idx) ~= 1 stk_error('Illegal indexing.', 'IllegalIndexing'); else % ok, only one level of indexing [n, d] = size (x.data); % one or two indices, but not more than that L = length (idx(1).subs); if L > 2 stk_error('Illegal indexing.', 'IllegalIndexing'); end val_data = double (val); if L == 2 % matrix-style indexing % Process row indices I = idx(1).subs{1}; if ischar (I) && ~ isequal (I, ':') I = process_char_indices (I, x.rownames, 'Row'); idx(1).subs{1} = I; elseif iscell (I) I = process_cell_indices (I, x.rownames, 'Row'); idx(1).subs{1} = I; end % Process column indices J = idx(1).subs{2}; if ischar (J) && ~ isequal (J, ':') J = process_char_indices (J, x.colnames, 'Column'); idx(1).subs{2} = J; elseif iscell (J) J = process_cell_indices (J, x.colnames, 'Column'); idx(1).subs{2} = J; end end if ~ isempty (val_data) % assignment x.data = subsasgn (x.data, idx, val_data); if L == 1 % linear indexing % Linear indexing is not allowed to change the shape of a % dataframe (this happens, with numeric arrays, when % indexing beyond numel) if ~ isequal (size (x.data), [n d]) stk_error ('Illegal indexing.', 'IllegalIndexing'); end else % matrix-style indexing [n1, d1] = size (x.data); val_is_an_stkdf = isa (val, 'stk_dataframe'); % Column names if val_is_an_stkdf && (isequal (I, ':')) cn = val.colnames; xcn = x.colnames; if isempty (xcn) if ~ isempty (cn) xcn = repmat ({''}, 1, size (n1, 2)); x.colnames = subsasgn (xcn, idx, cn); end else if isempty (cn) cn = repmat ({''}, 1, size (val, 2)); end x.colnames = subsasgn (xcn, idx, cn); end elseif (d1 > d) && (~ isempty (x.colnames)) x.colnames = horzcat (x.colnames, ... repmat ({''}, 1, d1 - d)); end % Row names if val_is_an_stkdf && (isequal (J, ':')) rn = val.rownames; xrn = x.rownames; if isempty (xrn) if ~ isempty (rn) xrn = repmat ({''}, size (val, 1), 1); x.rownames = subsasgn (xrn, idx, rn); end else if isempty (rn) rn = repmat ({''}, size (val, 1), 1); end x.rownames = subsasgn (xrn, idx, rn); end elseif (n1 > n) && ~ isempty (x.rownames) x.rownames = vertcat (x.rownames, ... repmat ({''}, n1 - n, 1)); end end else % Assignment rhs is empty: deletion if L == 1 % Linear indexing if d == 1 % Column array => remove rows I = idx(1).subs{1}; J = 1; remove_rows = true; elseif n == 1 % Row array => remove columns I = 1; J = idx(1).subs{1}; remove_rows = false; else stk_error ('Illegal indexing.', 'IllegalIndexing'); end else % Matrix-style indexing remove_rows = strcmp (J, ':'); if ~ (remove_rows || (strcmp (I, ':'))) stk_error ('Illegal indexing.', 'IllegalIndexing'); end end if remove_rows % Keep column names x.data(I, :) = []; if ~ isempty (x.rownames) x.rownames(I) = []; end else % Remove columns x.data(:, J) = []; if ~ isempty (x.colnames) x.colnames(J) = []; end end end end case '{}' errmsg = 'Indexing with curly braces is not allowed.'; stk_error(errmsg, 'IllegalIndexing'); case '.' if strcmp (idx(1).subs, 'data') && length (idx) > 1 if strcmp (idx(2).type, '()') x = subsasgn (x, idx(2:end), val); else stk_error('Illegal indexing.', 'IllegalIndexing'); end else % other than 'data' if length (idx) > 1 val = subsasgn (get (x, idx(1).subs), idx(2:end), val); end x = set (x, idx(1).subs, val); end end end % function %!shared x, s, t, data %! x = stk_dataframe (rand (3, 2)); %! s = {'a'; 'b'; 'c'}; %! t = {'xx' 'yy'}; %!test %! x.rownames = s; %! assert (isequal (get (x, 'rownames'), s)) %!test %! x.colnames = t; %! assert (isequal (get (x, 'rownames'), s)) %! assert (isequal (get (x, 'colnames'), t)) %!test %! x.rownames{2} = 'dudule'; %! assert (isequal (get (x, 'rownames'), {'a'; 'dudule'; 'c'})) %! assert (isequal (get (x, 'colnames'), t)) %!test %! x.colnames{1} = 'martha'; %! assert (isequal (get (x, 'rownames'), {'a'; 'dudule'; 'c'})) %! assert (isequal (get (x, 'colnames'), {'martha' 'yy'})) % %!error x.colnames{1} = 'yy' % %!error x.colnames = {'xx' 'xx'} %!test %! data = stk_dataframe (zeros(3, 2), {'x1' 'x2'}); %! u = rand(3, 1); data.x2 = u; %! assert (isequal (double (data), [zeros(3, 1) u])) %!test %! data = stk_dataframe (zeros (3, 2), {'x1' 'x2'}); %! data.x2(3) = 27; %! assert (isequal (double (data), [0 0; 0 0; 0 27])) %!error data.toto = rand (3, 1); %!shared x %! x = stk_dataframe (reshape (1:12, 4, 3), {'u' 'v' 'w'}); %!test %! x(:, 2) = []; %! assert (isequal (size (x), [4 2])) %! assert (isequal (double (x), [1 9; 2 10; 3 11; 4 12])) %! assert (isequal (get (x, 'colnames'), {'u' 'w'})) %! assert (isempty (get (x, 'rownames'))) %!test %! x(2, :) = []; %! assert (isequal (size (x), [3 2])) %! assert (isequal (double (x), [1 9; 3 11; 4 12])) %! assert (isempty (get (x, 'rownames'))) %!test %! x.rownames = {'a'; 'b'; 'c'}; %! x(2, :) = []; %! assert (isequal (size (x), [2 2])) %! assert (isequal (double (x), [1 9; 4 12])) %! assert (isequal (x.rownames, {'a'; 'c'})) %!test % change one value with matrix-style indexing %! x(1, 2) = 11; %! assert (isequal (size (x), [2 2])) %! assert (isequal (double (x), [1 11; 4 12])) %!test % change one value with linear indexing %! x(3) = 13; %! assert (isequal (size (x), [2 2])) %! assert (isequal (double (x), [1 13; 4 12])) %!assert (isequal (double (x(:, :)), [1 13; 4 12])); %!test % assignment to a variable that doesn't exist %! A = stk_dataframe (7.1); %! clear B; B(2) = A; %! assert (strcmp (class (B), 'stk_dataframe')) %! assert (isequal (B.data, [0 7.1])); %!test % repmat %! x = stk_dataframe (1); %! y = repmat (x, 2, 3); %! assert (isa (y, 'stk_dataframe')); %! assert (isequal (y.data, ones (2, 3))); %!test %! x(:, :) = []; %! assert (isempty (x)); %!test % Delete the only row of a one-row dataframe %! y1 = stk_dataframe ([1.2 3.33], {'mean', 'var'}); %! y1(1, :) = []; % Remove the only row of data %! assert (isequal (size (y1), [0 2])) %! assert (isequal (y1.colnames, {'mean', 'var'})) %! y11 = get (y1, 'mean'); %! assert (isempty (y11)); %!error x{1} = 2; %!error x(1, 2) = []; %!error x(1, 2).a = 3; %--- tests with a univariate dataframe ---------------------------------------- %!shared x %! x = stk_dataframe((1:5)'); % linear indexing %!test x(2) = 0; assert (isequal (double (x), [1; 0; 3; 4; 5])); %!test x(3) = []; assert (isequal (double (x), [1; 0; 4; 5])); % matrix-style indexing also %!test x(3, 1) = 0; assert (isequal(double(x), [1; 0; 0; 5])); % three indices is not allowed (even if the third is one...) %!error x(3, 1, 1) = 297; %!test % create a new row and a new column through subsasgn() %! x = stk_dataframe (rand (5, 2)); x(6, 3) = 7; %! assert(isequal(size(x), [6, 3])); %--- tests adding row/columns through row/columns names ------------------------ %!test %! x = stk_dataframe ([]); %! x.colnames{2} = 'v'; %! x.rownames{2} = 'b'; %! assert (isequal (x.rownames, {''; 'b'})); %! assert (isequal (x.colnames, {'' 'v'})); %! assert (isequal (size (x.data), [2 2]) && (all (isnan (x.data(:))))) %--- test replacing one column using ':' --------------------------------------- %!shared x %! x = stk_dataframe (reshape (1:12, 4, 3), {'u' 'v' 'w'}); %!test % change one column using ':', plain numeric argument %! y = [0; 9; 0; 9]; %! z = x; z(:, 2) = y; %! assert (isequal (z(:, 1), x(:, 1))); %! assert (isequal (z(:, 2).data, y)); %!test % change one column using ':', skt_dataframe argument %! y = stk_dataframe ([0; 9; 0; 9], {'y'}); %! z = x; z(:, 2) = y; %! assert (isequal (z(:, 1), x(:, 1))); %! assert (isequal (z(:, 2), y)); %--- test replacing one row using ':' ------------------------------------------ %!shared x %! x = stk_dataframe (reshape (1:12, 4, 3), [], {'a'; 'b'; 'c'; 'd'}); %!test % change one row using ':', plain numeric argument %! y = [7 7 7]; %! z = x; z(3, :) = y; %! assert (isequal (z(1, :), x(1, :))); %! assert (isequal (z(3, :).data, y)); %!test % change one row using ':', skt_dataframe argument %! y = stk_dataframe ([7 7 7], [], {'y'}); %! z = x; z(3, :) = y; %! assert (isequal (z(1, :), x(1, :))); %! assert (isequal (z(3, :), y)); %--- change several values at once with linear indexing ------------------------ %!shared x %! x = stk_dataframe (zeros (2), {'u' 'v'}); %!test % first column %! x(1:2) = 1; %! y = stk_dataframe ([1 0; 1 0], {'u' 'v'}); %! assert (isequal (x, y)); %!test % one more element %! x(1:3) = 2; %! y = stk_dataframe ([2 2; 2 0], {'u' 'v'}); %! assert (isequal (x, y)); %!error % too many elements %! x(1:5) = 3; %--- add just one row/column name ---------------------------------------------- %!shared x %! x = stk_dataframe (randn (3, 3)); %!test x.colnames{2} = 'y'; %!assert (isequal (x.colnames, {'' 'y' ''})); %!test x.rownames{2} = 'b'; %!assert (isequal (x.rownames, {''; 'b'; ''})); stk/inst/arrays/@stk_dataframe/subsref.m0000644000000000000000000001154413156161544015572 0ustar % SUBSREF [overload base function] % Copyright Notice % % Copyright (C) 2015, 2017 CentraleSupelec % Copyright (C) 2013 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function t = subsref (x, idx) switch idx(1).type case '()' L = length (idx(1).subs); if L == 1 % linear indexing t = subsref (x.data, idx); elseif L == 2 % matrix-style indexing % Process row indices I = idx(1).subs{1}; if ischar (I) && ~ isequal (I, ':') I = process_char_indices (I, x.rownames, 'Row'); elseif iscell (I) I = process_cell_indices (I, x.rownames, 'Row'); end % Process column indices J = idx(1).subs{2}; if ischar (J) && ~ isequal (J, ':') J = process_cell_indices (J, x.colnames, 'Column'); elseif iscell (J) J = process_cell_indices (J, x.colnames, 'Column'); end if isempty (I) if isempty (J) t_data = []; else t_data = zeros (0, size (x.data, 2)); t_data = t_data(:, J); end else if isempty (J) t_data = zeros (size (x.data, 1), 0); t_data = t_data(I, :); else t_data = x.data(I, J); end end if isempty (x.colnames) cn = {}; else cn = x.colnames(1, J); end if isempty (x.rownames) rn = {}; else rn = x.rownames(I, 1); end t = stk_dataframe (t_data, cn, rn); else stk_error ('Illegal indexing.', 'IllegalIndexing'); end case '{}' errmsg = 'Indexing with curly braces is not allowed.'; stk_error (errmsg, 'IllegalIndexing'); case '.' t = get (x, idx(1).subs); end if (length (idx)) > 1 t = subsref (t, idx(2:end)); end end % function %!shared x, s, t, data %! x = stk_dataframe(rand(3, 2)); %! s = {'a'; 'b'; 'c'}; %! t = {'xx' 'yy'}; %!test %! x = set(x, 'rownames', s); %! assert (isequal (x.rownames, s)) %! assert (isequal (x.rownames{2}, 'b')) %!test %! x = set(x, 'colnames', t); %! assert (isequal (x.rownames, s)) %! assert (isequal (x.colnames, t)) %! assert (isequal (x.colnames{2}, 'yy')) %--- tests with a bivariate dataframe + column names -------------------------- %!shared u, data %! u = rand(3, 2); %! data = stk_dataframe(u, {'x1', 'x2'}); %!assert (isequal (data.x2, u(:, 2))) %!assert (data.x2(3) == u(3, 2)) %!error t = data.toto; %!error t = data(1, 1).zzz; % illegal multilevel indexing %!error t = data(1, 1, 1); % too many indices %!error t = data{1}; % curly braces not allowed %!test % select rows and columns %! x = stk_dataframe (reshape (1:15, 5, 3), {'u' 'v' 'w'}); %! assert (isequal (x([3 5], 2), stk_dataframe ([8; 10], {'v'}))); %--- tests with a univariate dataframe ---------------------------------------- %!shared u, data %! u = rand(3, 1); data = stk_dataframe(u, {'x'}); %!assert (isequal (data.x, u)) %!assert (isequal (double (data), u)) %!assert (isequal (double (data(2)), u(2))) %!assert (isequal (double (data(3, 1)), u(3))) %!error t = data(1, 1, 1); % too many indices %--- empty indexing ------------------------------------------------------------ %!test %! x = stk_dataframe (randn (2, 2), {'u' 'v'}); %! y = x ([], :); %! assert (isa (y, 'stk_dataframe')); %! assert (isequal (size (y), [0 2])); %! assert (isequal (y.colnames, {'u' 'v'})); %!test %! x = stk_dataframe (randn (2, 2), [], {'a' 'b'}); %! y = x (:, []); %! assert (isa (y, 'stk_dataframe')); %! assert (isequal (size (y), [2 0])); %! assert (isequal (y.rownames, {'a'; 'b'})); stk/inst/arrays/@stk_dataframe/sum.m0000644000000000000000000000241313156161544014720 0ustar % SUM [overload base function] % Copyright Notice % % Copyright (C) 2013 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function z = sum(x, dim) if nargin < 2, dim = 1; end z = apply(x, dim, @sum); end % function %!shared x1, df1 %! x1 = rand(9, 3); %! df1 = stk_dataframe(x1, {'a', 'b', 'c'}); %!assert (isequal (sum(df1), sum(x1))) %!assert (isequal (sum(df1, 1), sum(x1))) %!assert (isequal (sum(df1, 2), sum(x1, 2))) stk/inst/arrays/@stk_dataframe/tan.m0000644000000000000000000000223313156161544014676 0ustar % TAN [overload base function] % Copyright Notice % % Copyright (C) 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function ydata = tan (x) ydata = tan (x.data); end % function %!test %! u = rand (4, 3); x = stk_dataframe (u); v = tan (x); %! assert (strcmp (class (v), class (u)) && isequal (v, tan (u))) stk/inst/arrays/@stk_dataframe/tand.m0000644000000000000000000000224013156161544015040 0ustar % TAND [overload base function] % Copyright Notice % % Copyright (C) 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function ydata = tand (x) ydata = tand (x.data); end % function %!test %! u = rand (4, 3); x = stk_dataframe (u); v = tand (x); %! assert (strcmp (class (v), class (u)) && isequal (v, tand (u))) stk/inst/arrays/@stk_dataframe/tanh.m0000644000000000000000000000224013156161544015044 0ustar % TANH [overload base function] % Copyright Notice % % Copyright (C) 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function ydata = tanh (x) ydata = tanh (x.data); end % function %!test %! u = rand (4, 3); x = stk_dataframe (u); v = tanh (x); %! assert (strcmp (class (v), class (u)) && isequal (v, tanh (u))) stk/inst/arrays/@stk_dataframe/times.m0000644000000000000000000000232013156161544015232 0ustar % TIMES [overload base function] % Copyright Notice % % Copyright (C) 2013 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function y = times(x1, x2) y = bsxfun(@times, x1, x2); end % function %!test stk_test_dfbinaryop(@times, rand(7, 2), rand(7, 2)); %!test stk_test_dfbinaryop(@times, rand(7, 2), pi); %!error stk_test_dfbinaryop(@times, rand(7, 2), rand(7, 3)); stk/inst/arrays/@stk_dataframe/transpose.m0000644000000000000000000000263513156161544016140 0ustar % TRANSPOSE [overload base function] % Copyright Notice % % Copyright (C) 2013 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function y = transpose(x) rn = get(x, 'rownames'); cn = get(x, 'colnames'); y = stk_dataframe(transpose(x.data), rn', cn'); end % function %!test %! u = rand(3, 2) + 1i * rand(3, 2); %! data = stk_dataframe(u, {'x' 'y'}, {'obs1'; 'obs2'; 'obs3'}); %! data = data.'; %! assert (isa(data, 'stk_dataframe') && isequal(double(data), u.')); %! assert (isequal(data.rownames, {'x'; 'y'})); %! assert (isequal(data.colnames, {'obs1' 'obs2' 'obs3'})); stk/inst/arrays/@stk_dataframe/uminus.m0000644000000000000000000000203613156161544015435 0ustar % UMINUS [overload base function] % Copyright Notice % % Copyright (C) 2015 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function x = uminus (x) x.data = - x.data; end % function stk/inst/arrays/@stk_dataframe/uplus.m0000644000000000000000000000201013156161544015255 0ustar % UPLUS [overload base function] % Copyright Notice % % Copyright (C) 2015 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function x = uplus (x) end % function stk/inst/arrays/@stk_dataframe/var.m0000644000000000000000000000301413156161544014702 0ustar % VAR [overload base function] % Copyright Notice % % Copyright (C) 2013 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function z = var(x, flag, dim) if nargin < 2, flag = 0; end % default: normalize by N-1 if nargin < 3, dim = 1; end % default: act along columns z = apply(x, dim, @var, flag); end % function %!shared x1, df1 %! x1 = rand(9, 3); %! df1 = stk_dataframe(x1, {'a', 'b', 'c'}); %!assert (isequal (var(df1), var(x1))) %!assert (isequal (var(df1, 0, 1), var(x1))) %!assert (isequal (var(df1, 0, 2), var(x1, 0, 2))) %!assert (isequal (var(df1, 1), var(x1, 1))) %!assert (isequal (var(df1, 1, 1), var(x1, 1))) %!assert (isequal (var(df1, 1, 2), var(x1, 1, 2))) stk/inst/arrays/@stk_dataframe/vertcat.m0000644000000000000000000001276613156161544015600 0ustar % VERTCAT [overload base function] % Copyright Notice % % Copyright (C) 2015, 2017 CentraleSupelec % Copyright (C) 2013, 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function x = vertcat (x, y, varargin) if nargin < 2 y = []; end %--- Get raw data and concatenate ----------------------------------------- x_data = double (x); y_data = double (y); % We let the base vertcat function generate an error if needed data = [x_data; y_data]; %--- Get column and row names of inputs ---------------------------------- if isa (x, 'stk_dataframe') x_colnames = get (x, 'colnames'); x_rownames = get (x, 'rownames'); else x_colnames = {}; x_rownames = {}; end if isa (y, 'stk_dataframe') y_colnames = get (y, 'colnames'); y_rownames = get (y, 'rownames'); else y_colnames = {}; y_rownames = {}; end %--- Create output column names ------------------------------------------- if isempty (x_colnames) colnames = y_colnames; elseif isempty (y_colnames) colnames = x_colnames; else x_empty = cellfun (@isempty, x_colnames); y_empty = cellfun (@isempty, y_colnames); xy_equal = strcmp (x_colnames, y_colnames); if all (x_empty | y_empty | xy_equal) colnames = x_colnames; colnames(x_empty) = y_colnames(x_empty); else warning ('STK:vertcat:IncompatibleColNames', sprintf ( ... ['Incompatible column names !\nThe output of vertcat ' ... 'will have no column names.'])); colnames = {}; end end %--- Create output row names ---------------------------------------------- bx = isempty (x_rownames); by = isempty (y_rownames); if bx && by % none of the argument has row names rownames = {}; else % at least of one the arguments has row names if bx, x_rownames = repmat ({''}, size (x_data, 1), 1); end if by, y_rownames = repmat ({''}, size (y_data, 1), 1); end rownames = [x_rownames; y_rownames]; end %--- Create output -------------------------------------------------------- if strcmp (class (x), 'stk_dataframe') %#ok % Optimize for speed (no need to call constructor) x.data = data; x.colnames = colnames; x.rownames = rownames; else x = stk_dataframe (data, colnames, rownames); end if ~ isempty (varargin) x = vertcat (x, varargin{:}); end end % function %#ok<*SPWRN> % IMPORTANT NOTE: [x; y; ...] fails to give the same result as vertcat (x, y, % ...) in some releases of Octave. As a consequence, all tests must be written % using vertcat explicitely. %!shared u, v %! u = rand (3, 2); %! v = rand (3, 2); %% % Vertical concatenation of two dataframes %!test %! x = stk_dataframe (u); %! y = stk_dataframe (v); %! z = vertcat (x, y); %! assert (isa (z, 'stk_dataframe') && isequal (double (z), [u; v])); %!test % the same, with row names this time %! x = stk_dataframe (u, {}, {'a'; 'b'; 'c'}); %! y = stk_dataframe (v, {}, {'d'; 'e'; 'f'}); %! z = vertcat (x, y); %! assert (isa (z, 'stk_dataframe') && isequal (double (z), [u; v])); %! assert (all (strcmp (z.rownames, {'a'; 'b'; 'c'; 'd'; 'e'; 'f'}))); %!test % the same, with row names only for the first argument %! x = stk_dataframe (u, {}, {'a'; 'b'; 'c'}); %! y = stk_dataframe (v); %! z = vertcat (x, y); %! assert (isa (z, 'stk_dataframe') && isequal (double (z), [u; v])); %!test % incompatible variable names %! u = rand (3, 1); x = stk_dataframe (u, {'x'}); %! v = rand (3, 1); y = stk_dataframe (v, {'y'}); %! z = vertcat (x, y); %! assert (isequal (z.colnames, {})); %% % Vertical concatenation [dataframe; matrix] %!test %! x = stk_dataframe (u); %! z = vertcat (x, v); %! assert (isa (z, 'stk_dataframe') && isequal (double (z), [u; v])); %!test % the same, with row names for the first argument %! x = stk_dataframe (u, {}, {'a'; 'b'; 'c'}); %! z = vertcat (x, v); %! assert (isa (z, 'stk_dataframe') && isequal (double (z), [u; v])); %% % Vertical concatenation [matrix; dataframe] %!test %! y = stk_dataframe (v); %! z = vertcat (u, y); %! assert (isa (z, 'stk_dataframe') && (isequal (double (z), [u; v]))); %% % Vertical concatenation of more than two elements %!test %! x = stk_dataframe (u); %! y = stk_dataframe (v); %! z = vertcat (x, y, u, v); %! assert (isa (z, 'stk_dataframe') && isequal (double (z), [u; v; u; v])); %% % Vertical concatenation with missing column names %!shared x, y %! x = stk_dataframe (rand (2, 3), {'a', 'b', 'c'}); %! y = stk_dataframe (rand (3, 2), {'a', 'b'}); %! y = horzcat (y, rand(3, 1)); % last column name is missing %!test %! z = vertcat (x, y); %! assert (isequal (z.colnames, {'a' 'b' 'c'})) %!test %! z = vertcat (y, x); %! assert (isequal (z.colnames, {'a' 'b' 'c'})) stk/inst/arrays/@stk_dataframe/xlim.m0000644000000000000000000000243013156161544015064 0ustar % XLIM [overload base function] % Copyright Notice % % Copyright (C) 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function varargout = xlim (arg1, arg2) varargout = cell (1, nargout); if nargin == 1, [varargout{:}] = xlim (double (arg1)); return end if isa (arg1, 'stk_dataframe'), arg1 = double (arg1); end if isa (arg2, 'stk_dataframe'), arg2 = double (arg2); end [varargout{:}] = xlim (arg1, arg2); end % function stk/inst/arrays/@stk_dataframe/xor.m0000644000000000000000000000206013156161544014722 0ustar % XOR [overload base function] % Copyright Notice % % Copyright (C) 2017 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function y = xor (x1, x2) y = xor (logical (x1), logical (x2)); end % function stk/inst/arrays/@stk_dataframe/ylim.m0000644000000000000000000000243013156161544015065 0ustar % YLIM [overload base function] % Copyright Notice % % Copyright (C) 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function varargout = ylim (arg1, arg2) varargout = cell (1, nargout); if nargin == 1, [varargout{:}] = ylim (double (arg1)); return end if isa (arg1, 'stk_dataframe'), arg1 = double (arg1); end if isa (arg2, 'stk_dataframe'), arg2 = double (arg2); end [varargout{:}] = ylim (arg1, arg2); end % function stk/inst/arrays/@stk_factorialdesign/0000755000000000000000000000000013156161544015150 5ustar stk/inst/arrays/@stk_factorialdesign/contour.m0000644000000000000000000000226613156161544017025 0ustar % CONTOUR [overload base function] % % See also: stk_factorialdesign/surf, stk_factorialdesign/mesh, ... % Copyright Notice % % Copyright (C) 2016 CentraleSupelec % Copyright (C) 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function h_plot = contour (varargin) h_plot = plot_surfmeshcontour (@contour, varargin{:}); end % function stk/inst/arrays/@stk_factorialdesign/fieldnames.m0000644000000000000000000000253713156161544017444 0ustar % FIELDNAMES [overload base function] % Copyright Notice % % Copyright (C) 2015 CentraleSupelec % Copyright (C) 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function fn = fieldnames (x) fn = fieldnames (x.stk_dataframe); fn = [{'levels' 'stk_dataframe'} fn]; end % function %!test %! x = stk_factorialdesign ({0:1, 3:5}, {'u' 'v'}); %! fn1 = sort (fieldnames (x)); %! fn2 = {'colnames', 'data', 'info', 'levels', ... %! 'rownames', 'stk_dataframe', 'u', 'v'}; %! assert (isequal (fn1, fn2)); stk/inst/arrays/@stk_factorialdesign/get.m0000644000000000000000000000237513156161544016114 0ustar % GET [overload base function] % Copyright Notice % % Copyright (C) 2013 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function t = get (x, propname) switch propname, case 'levels' t = x.levels; case 'stk_dataframe' % Read-only access to the underlying df t = x.stk_dataframe; otherwise t = get (x.stk_dataframe, propname); end end % function stk/inst/arrays/@stk_factorialdesign/isequal.m0000644000000000000000000000303713156161544016774 0ustar % ISEQUAL [overload base function] % Copyright Notice % % Copyright (C) 2017 CentraleSupelec % Copyright (C) 2013 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . % INTERNAL NOTE: overloaded for Octave 3.2.x compat / see CODING_GUIDELINES function b = isequal (x, y, varargin) if nargin < 2 stk_error ('Not enough input arguments.', 'NotEnoughInputArgs'); end % First, make sure that x and y belong to the same class % (either stk_dataframe or some derived class) b = isa (x, 'stk_factorialdesign') && strcmp (class (y), class (x)) ... && isequal (x.levels, y.levels) && isequal (x.stk_dataframe, y.stk_dataframe); if b && (nargin > 2) b = isequal (x, varargin{:}); end end % function stk/inst/arrays/@stk_factorialdesign/ismember.m0000644000000000000000000000540713156161544017137 0ustar % ISMEMBER [overload base function] % Copyright Notice % % Copyright (C) 2017 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function varargout = ismember (A, B, varargin) if ~ all (cellfun (@ischar, varargin)) stk_error ('Invalid flag (should be a string).', 'InvalidArgument'); end if isa (A, 'stk_factorialdesign') varargout = cell (1, max (nargout, 1)); [varargout{:}] = ismember (double (A), B, varargin{:}); else % B is an stk_factorialdesign object has_rows = false; has_legacy = false; for k = 1:(numel (varargin)) switch varargin{k} case 'rows' has_rows = true; case 'legacy' has_legacy = true; otherwise errmsg = sprintf ('Unknown flag: %s', varargin{k}); stk_error (errmsg, 'InvalidArgument'); end end if has_rows && ~ has_legacy && (nargout < 2) % This case can be optimized lia = ismember_fd (A, B); varargout = {lia}; else % otherwise, use the base ismember function varargout = cell (1, max (nargout, 1)); [varargout{:}] = ismember (A, double (B), varargin{:}); end end end % function function [lia, locb] = ismember_fd (A, B) [n, dim] = size (A); if dim ~= length (B.levels) stk_error (['A and B should have the same number ' ... 'of columns'], 'InvalidArgument'); end b = false (n, dim); for j = 1:dim b(:, j) = ismember (A(:, j), B.levels{j}); end lia = all (b, 2); end % function %!shared A, B, BB, b %! %! i_max = 10; n = 100; d = 5; %! %! A = randi (i_max, n, d); %! %! levels = repmat ({1:i_max}, 1, d); %! levels{4} = 1:2:i_max; %! B = stk_factorialdesign (levels); %! %! BB = double (B); %!test b = ismember (A, B); %!assert (isequal (b, ismember (A, BB))); %!test b = ismember (A, B, 'rows'); %!assert (isequal (b, ismember (A, BB, 'rows'))); stk/inst/arrays/@stk_factorialdesign/mesh.m0000644000000000000000000000226013156161544016262 0ustar % MESH [overload base function] % % See also: stk_factorialdesign/contour, stk_factorialdesign/surf, ... % Copyright Notice % % Copyright (C) 2016 CentraleSupelec % Copyright (C) 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function h_plot = mesh (varargin) h_plot = plot_surfmeshcontour (@mesh, varargin{:}); end % function stk/inst/arrays/@stk_factorialdesign/meshc.m0000644000000000000000000000226313156161544016430 0ustar % MESHC [overload base function] % % See also: stk_factorialdesign/contour, stk_factorialdesign/surf, ... % Copyright Notice % % Copyright (C) 2016 CentraleSupelec % Copyright (C) 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function h_plot = meshc (varargin) h_plot = plot_surfmeshcontour (@meshc, varargin{:}); end % function stk/inst/arrays/@stk_factorialdesign/meshz.m0000644000000000000000000000226313156161544016457 0ustar % MESHZ [overload base function] % % See also: stk_factorialdesign/contour, stk_factorialdesign/surf, ... % Copyright Notice % % Copyright (C) 2016 CentraleSupelec % Copyright (C) 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function h_plot = meshz (varargin) h_plot = plot_surfmeshcontour (@meshz, varargin{:}); end % function stk/inst/arrays/@stk_factorialdesign/ndgrid.m0000644000000000000000000000505213156161544016577 0ustar % NDGRID produces ndgrid-style coordinate arrays % % CALL: [X1, X2, ...] = ndgrid (X) % % produces ndgrid-style coordinate arrays X1, X2, ... Xd based on the % @stk_factorialdesign object X (where d is the number of columns of % X). This is equivalent to % % [X1, ..., Xd] = ndgrid (X.levels{1}, ..., X.levels{d}); % % See also: ndgrid % Copyright Notice % % Copyright (C) 2013, 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function varargout = ndgrid (x) d = length (x.levels); if nargout > d stk_error ('Too many output arguments.', 'TooManyOutputArgs'); else if (d == 0) || any (cellfun (@isempty, x.levels)) varargout = repmat ({[]}, 1, nargout); elseif d == 1 varargout = {x.levels{1}(:)}; else varargout = cell (1, max (nargout, 1)); [varargout{:}] = ndgrid (x.levels{:}); end end end % function %--- general case ------------------------------------------------------------- %!shared data %! data = stk_factorialdesign ({[0 1], [5 6 7]}); %!test % nargout = 0 %! ndgrid (data); %! assert (isequal (ans, [0 0 0; 1 1 1])); %!test % nargout = 1 %! x = ndgrid (data); %! assert (isequal (x, [0 0 0; 1 1 1])); %!test % nargout = 2 %! [x, y] = ndgrid (data); %! assert (isequal ({x, y}, {[0 0 0; 1 1 1], [5 6 7; 5 6 7]})); %!error % nargout = 3 %! [x, y, z] = ndgrid (data); %--- special cases ------------------------------------------------------------ %!test %! data = stk_factorialdesign ({[], []}); %! [x, y] = ndgrid (data); %! assert (isequal ({x, y}, {[], []})); %!test %! data = stk_factorialdesign ({[1:3]}); %! x = ndgrid (data); %! assert (isequal (x, [1; 2; 3])); stk/inst/arrays/@stk_factorialdesign/pcolor.m0000644000000000000000000000226613156161544016632 0ustar % PCOLOR [overload base function] % % See also: stk_factorialdesign/contour, stk_factorialdesign/mesh, ... % Copyright Notice % % Copyright (C) 2016 CentraleSupelec % Copyright (C) 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function h_plot = pcolor (varargin) h_plot = plot_surfmeshcontour (@pcolor, varargin{:}); end % function stk/inst/arrays/@stk_factorialdesign/private/0000755000000000000000000000000013156161544016622 5ustar stk/inst/arrays/@stk_factorialdesign/private/plot_surfmeshcontour.m0000644000000000000000000001104413156161544023304 0ustar % PLOT_SURFMESHCONTOUR [STK internal] % Copyright Notice % % Copyright (C) 2016, 2017 CentraleSupelec % Copyright (C) 2013 Valentin Resseguier % Copyright (C) 2012-2014 SUPELEC % % Author: Julien Bect % Valentin Resseguier % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function h_plot = plot_surfmeshcontour (plotfun, varargin) [h_axes, x, z, opts] = parse_args_ (varargin{:}); %--- Deal with various possible types for the 'z' argument ---------------- if ischar (z) || isa (z, 'function_handle') z = double (stk_feval (z, x)); else z = double (z); end %--- Do the actual plotting job ------------------------------------------- [xx1, xx2] = ndgrid (x); h_plot = call_plotfun (plotfun, h_axes, ... xx1, xx2, reshape (z, size (xx1)), opts{:}); % Create labels if x provides column names c = get (x.stk_dataframe, 'colnames'); if ~ isempty (c) stk_xlabel (h_axes, c{1}, 'interpreter', 'none'); % CG#10 end if length (c) > 1 stk_ylabel (h_axes, c{2}, 'interpreter', 'none'); % CG#10 end % Use interpolated shading for surf and pcolor plots if ismember (func2str (plotfun), {'surf', 'pcolor'}) shading (h_axes, 'interp'); end end % function %#ok<*TRYNC> function [h_axes, x, z, opts] = parse_args_ (varargin) %--- Formal grammar for the list of arguments ----------------------------- % % Terminal symbols % % h = a handle to an axes object % x = stk_factorial_design object % z = ordinate argument % % Derivation rules % % ::= | h % ::= x z % Extract axis handle (if it is present) [h_axes, varargin, n_argin] = stk_plot_getaxesarg (varargin{:}); if n_argin < 2 stk_error ('Not enough input arguments.', 'NotEnoughInputArgs'); end x = varargin{1}; z = varargin{2}; opts = varargin(3:end); % Then, x must be an stk_factorialdesign object if ~ isa (x, 'stk_factorialdesign') stk_error (['The first input argument should be a handle to existing' ... 'axes or and stk_factorialdesign object.'], 'TypeMismatch'); end dim = size (x, 2); if dim ~= 2 errmsg = 'Only works for two-dimensional factor spaces.'; stk_error (errmsg, 'InvalidArgument'); end end % function function h_plot = call_plotfun (plotfun, h_axes, x, y, z, varargin) % In Octave 3.6.4, pcolor supports neither the axis handle argument nor % the optional parameter/value arguments. This function has been created to % overcome this and other similar issues. try % When the full 'modern' syntax is supported, the result is usually better, % in particular when options are provided. Let's try that first. if strcmp (func2str (plotfun), 'contour') [ignd, h_plot] = contour ... (h_axes, x, y, z, varargin{:}); %#ok CG#07 else h_plot = plotfun (h_axes, x, y, z, varargin{:}); end catch %#ok % Do we have an additional numeric argument ? if isempty (varargin) numarg = {}; opts = {}; else if ischar (varargin{1}) numarg = {}; opts = varargin; else numarg = varargin(1); opts = varargin(2:end); end end % Select the axes to draw on h1 = gca (); axes (h_axes); try if strcmp (func2str (plotfun), 'contour') [ignd, h_plot] = contour (x, y, z, numarg{:}); %#ok CG#07 else h_plot = plotfun (x, y, z, numarg{:}); end if ~ isempty (opts) set (h_plot, opts{:}); end axes (h1); catch %#ok axes (h1); rethrow (lasterror ()); %#ok end end % try_catch end % function stk/inst/arrays/@stk_factorialdesign/set.m0000644000000000000000000000377113156161544016131 0ustar % SET [overload base function] % Copyright Notice % % Copyright (C) 2013, 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function x = set (x, propname, value) df = x.stk_dataframe; switch propname, case 'levels', % We proceed in two steps, instead of the seemingly simpler % x = stk_factorialdesign (value); % to preserve the value of the other fields (info, colnames, ...). tmp = stk_factorialdesign (value); x = set_data (df, tmp.data); case 'stk_dataframe', errmsg = 'Field .stk_dataframe is read-only.'; stk_error (errmsg, 'ReadOnlyField'); case {'colnames', 'rownames', 'info'}, x.stk_dataframe = set (df, propname, value); otherwise, if ismember (propname, fieldnames (df)) % The result is not an stk_factorialdesign object anymore, in % general. An implicit cast to stk_dataframe is thus performed. x = set (df, propname, value); else errmsg = sprintf ('There is no field named: %s.', propname); stk_error (errmsg, 'UnknownField'); end end end % function stk/inst/arrays/@stk_factorialdesign/stk_boundingbox.m0000644000000000000000000000313213156161544020524 0ustar % STK_BOUNDINGBOX [overload STK function] % Copyright Notice % % Copyright (C) 2015 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function box = stk_boundingbox (x) if nargin > 1 stk_error ('Too many input arguments.', 'TooManyInputArgs'); end xmin = cellfun (@min, x.levels); xmax = cellfun (@max, x.levels); dim = numel (xmin); xmin = reshape (xmin, 1, dim); xmax = reshape (xmax, 1, dim); box = stk_hrect ([xmin; xmax]); box.colnames = x.stk_dataframe.colnames; end % function %!shared x, y, cn %! cn = {'a', 'b', 'c'}; %! x = stk_factorialdesign ({[1 2], [3 4 5], [0 2 8]}, cn); %!error y = stk_boundingbox (); %!test y = stk_boundingbox (x); %!error y = stk_boundingbox (x, 1); %!assert (isequal (y, stk_hrect ([1 3 0; 2 5 8], cn))); stk/inst/arrays/@stk_factorialdesign/stk_dataframe.m0000644000000000000000000000537313156161544020143 0ustar % @STK_FACTORIALDESIGN/STK_DATAFRAME [overload STK function] % % See also: stk_dataframe % Copyright Notice % % Copyright (C) 2017 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function x = stk_dataframe (x, colnames, rownames) x = x.stk_dataframe; if nargin > 1 % Note: [] means "keep x.colnames" while {} means "no column names" if iscell (colnames) x = set (x, 'colnames', colnames); elseif ~ isempty (colnames) stk_error (['colnames should be either a cell array ' ... 'of strings or [].'], 'InvalidArgument'); end if nargin > 2 % Note: [] means "keep x.rownames" while {} means "no row names" if iscell (rownames) x = set (x, 'rownames', rownames); elseif ~ isempty (rownames) stk_error (['rownames should be either a cell array ' ... 'of strings or [].'], 'InvalidArgument'); end end end end % function %!shared x, cn, rn, y, cn2, rn2 %! cn = {'x' 'y'}; %! rn = {'a'; 'b'; 'c'; 'd'}; %! x = stk_factorialdesign ({1:2, 1:2}, cn, rn); %! cn2 = {'xx' 'yy'}; %! rn2 = {'aa'; 'bb'; 'cc'; 'dd'}; %!test y = stk_dataframe (x); %!assert (strcmp (class (y), 'stk_dataframe')) %!assert (isequal (y.colnames, cn)) %!assert (isequal (y.rownames, rn)) %!test y = stk_dataframe (x, cn2); %!assert (strcmp (class (y), 'stk_dataframe')) %!assert (isequal (y.colnames, cn2)) %!assert (isequal (y.rownames, rn)) %!test y = stk_dataframe (x, cn2, rn2); %!assert (strcmp (class (y), 'stk_dataframe')) %!assert (isequal (y.colnames, cn2)) %!assert (isequal (y.rownames, rn2)) %!test y = stk_dataframe (x, [], rn2); %!assert (strcmp (class (y), 'stk_dataframe')) %!assert (isequal (y.colnames, cn)) %!assert (isequal (y.rownames, rn2)) %!test y = stk_dataframe (x, {}, rn2); %!assert (strcmp (class (y), 'stk_dataframe')) %!assert (isequal (y.colnames, {})) %!assert (isequal (y.rownames, rn2)) stk/inst/arrays/@stk_factorialdesign/stk_factorialdesign.m0000644000000000000000000002072013156161544021346 0ustar % STK_FACTORIALDESIGN constructs a "full factorial design" array % Copyright Notice % % Copyright (C) 2015, 2017 CentraleSupelec % Copyright (C) 2013, 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function x = stk_factorialdesign (levels, varargin) if nargin == 0 % default constructor levels = {[]}; end if ~ iscell (levels) stk_error ('Expecting a cell array as first argument', 'TypeMismatch'); else % Guess the number of factors from the length of the cell array dim = length (levels); % Extract raw factor data and column names (when they are available) raw_levels = cell (1, dim); raw_levels_anyempty = false; colnames = cell (1, dim); colnames_allempty = true; for i = 1:dim li = levels{i}; if isa (li, 'stk_dataframe') assert (size (li, 2) == 1); cn = get (li, 'colnames'); if isempty (cn) colnames{i} = ''; else colnames(i) = cn; end raw_levels{i} = double (li); elseif isnumeric (li) colnames{i} = ''; raw_levels{i} = double (li(:)); levels{i} = raw_levels{i}; else errmsg = 'Only numeric factors are currently supported.'; stk_error (errmsg, 'TypeMismatch'); end if isempty (raw_levels{i}) raw_levels_anyempty = true; end if ~ isempty (colnames{i}) colnames_allempty = false; end end if (dim == 0) || raw_levels_anyempty xdata = zeros (0, dim); elseif dim == 1 xdata = raw_levels{1}; else % coordinate arrays coord = cell (1, dim); [coord{:}] = ndgrid (raw_levels{:}); % design matrix xdata = zeros (numel (coord{1}), dim); for j = 1:dim xdata(:, j) = coord{j}(:); end end % base dataframe df = stk_dataframe (xdata, varargin{:}); df = set (df, 'info', 'Created by stk_factorialdesign'); % column names ? if isempty (get (df, 'colnames')) && ~ colnames_allempty df = set (df, 'colnames', colnames); end % "factorial design" object x = struct (); x.levels = levels; x = class (x, 'stk_factorialdesign', df); end % if end % function %!test stk_test_class ('stk_factorialdesign') %--- constructor -------------------------------------------------------------- %!test % constructor with two factors + column names %! x = stk_factorialdesign ({[0 1], [1 2 3]}, {'a', 'b'}); %! assert (isequal(x.colnames, {'a', 'b'})); %! assert (isequal(get (x, 'colnames'), {'a', 'b'})); % tests some incorrect values for 'levels' %!error stk_factorialdesign ('bouh'); % categorical variable not supported yet %!error stk_factorialdesign ({{'a' 'b'}}); %--- disp & display ----------------------------------------------------------- %!shared x, fmt %! fmt = stk_disp_getformat (); %! x = stk_sampling_regulargrid (3^2, 2); %!test format rat; disp (x); %!test format long; disp (x); %!test format short; disp (x); format (fmt); %!test disp (stk_sampling_regulargrid (0^1, 1)); %!test disp (stk_sampling_regulargrid (0^2, 2)); %!test display (x); %--- size, length, end -------------------------------------------------------- %!error length (stk_sampling_regulargrid (7^2, 2)) % not defined %!shared x %! x = stk_factorialdesign ({[0 1], [0 1]}); %!assert (isequal (x(2:end, :), x(2:4, :))) %!assert (isequal (x(2, 1:end), x(2, :))) %!assert (isequal (x(2:end, 2:end), x(2:4, 2))) %!error x(1:end, 1:end, 1:end) %--- cat, vertcat, horzcat ---------------------------------------------------- % Note: the output is a plain stk_dataframe %!shared x, y %! x = stk_sampling_regulargrid (3^2, 2); %! y = x; %!test %%%% vercat %! z = vertcat (x, y); %! assert (strcmp (class (z), 'stk_dataframe')); %! assert (isequal (double (z), [double(x); double(y)])); %!test %%%% same thing, using cat(1, ...) %! z = cat (1, x, y); %! assert (strcmp (class (z), 'stk_dataframe')); %! assert (isequal (double (z), [double(x); double(y)])); %!test %%%% horzcat %! y.colnames = {'y1' 'y2'}; z = horzcat (x, y); %! assert (strcmp (class (z), 'stk_dataframe')); %! assert (isequal (double (z), [double(x) double(y)])); %!test %%%% same thing, using cat (2, ...) %! z = cat (2, x, y); %! assert (strcmp (class (z), 'stk_dataframe')); %! assert (isequal (double (z), [double(x) double(y)])); %!error cat (3, x, y) %--- apply & related functions ------------------------------------------------ %!shared x, t %! x = stk_sampling_regulargrid (3^2, 2); %! t = double (x); %!assert (isequal (apply (x, 1, @sum), sum (t, 1))) %!assert (isequal (apply (x, 2, @sum), sum (t, 2))) %!error u = apply (x, 3, @sum); %!assert (isequal (apply (x, 1, @min, []), min (t, [], 1))) %!assert (isequal (apply (x, 2, @min, []), min (t, [], 2))) %!error u = apply (x, 3, @min, []); %!assert (isequal (min (x), min (t))) %!assert (isequal (max (x), max (t))) %!assert (isequal (std (x), std (t))) %!assert (isequal (var (x), var (t))) %!assert (isequal (sum (x), sum (t))) %!assert (isequal (mean (x), mean (t))) %!assert (isequal (mode (x), mode (t))) %!assert (isequal (prod (x), prod (t))) %!assert (isequal (median (x), median (t))) %--- bsxfun & related functions ----------------------------------------------- %!shared x1, x2, x3, u1, u2, u3 %! x1 = stk_sampling_regulargrid ([4 3], 2); u1 = double (x1); %! x2 = stk_sampling_regulargrid ([3 4], 2); u2 = double (x2); %! x3 = x1 + 1; u3 = u1 + 1; %!test %! z = bsxfun (@plus, x1, u2); %! assert (isa (z, 'stk_dataframe') && isequal (double (z), u1 + u2)) %!test %! z = bsxfun (@plus, u1, x2); %! assert (isa (z, 'stk_dataframe') && isequal (double (z), u1 + u2)) %!test %! z = bsxfun (@plus, x1, x2); %! assert (isa (z, 'stk_dataframe') && isequal (double (z), u1 + u2)) %!test z = min (x1, x2); assert (isequal (double (z), min (u1, u2))); %!test z = max (x1, x2); assert (isequal (double (z), max (u1, u2))); %!error z = min (x1, x2, 1); %!error z = max (x1, x2, 1); %!test z = x1 + x2; assert (isequal (double (z), u1 + u2)); %!test z = x1 - x2; assert (isequal (double (z), u1 - u2)); %!test z = x1 .* x2; assert (isequal (double (z), u1 .* u2)); %!test z = x3 .\ x2; assert (isequal (double (z), u3 .\ u2)); %!test z = x2 ./ x3; assert (isequal (double (z), u2 ./ u3)); %!test z = x3 .^ x2; assert (isequal (double (z), u3 .^ u2)); %!test z = realpow (x3, x2); assert (isequal (double (z), realpow (u3, u2))); %!test z = (x1 == x2); assert (isequal (double (z), (u1 == u2))); %!test z = (x1 ~= x2); assert (isequal (double (z), (u1 ~= u2))); %!test z = (x1 <= x2); assert (isequal (double (z), (u1 <= u2))); %!test z = (x1 >= x2); assert (isequal (double (z), (u1 >= u2))); %!test z = (x1 < x2); assert (isequal (double (z), (u1 < u2))); %!test z = (x1 > x2); assert (isequal (double (z), (u1 > u2))); %!test z = x1 & x2; assert (isequal (double (z), u1 & u2)); %!test z = x1 | x2; assert (isequal (double (z), u1 | u2)); %!test z = xor (x1, x2); assert (isequal (double (z), xor (u1, u2))); %--- transpose, ctranspose ---------------------------------------------------- % Transposing a dataframe that represents a factorial design results in a % dataframe that does NOT represent a factorial design %!shared x %! x = stk_factorialdesign ({[0 1], [0 1 2]}); %!assert (strcmp (class (x'), 'stk_dataframe')) %!assert (strcmp (class (x.'), 'stk_dataframe')) stk/inst/arrays/@stk_factorialdesign/stk_normalize.m0000644000000000000000000000315213156161544020210 0ustar % STK_NORMALIZE [overload STK function] % Copyright Notice % % Copyright (C) 2013, 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function x = stk_normalize (x, varargin) if (~ isa (x, 'stk_factorialdesign')) % One of the box arguments is an stk_factorialdesign object stk_error (['stk_factorialdesign objects cannot be used as values ' ... 'for ''box'' arguments.'], 'TypeMismatch'); end % Normalize using @stk_dataframe/stk_normalize [x.stk_dataframe, a, b] = stk_normalize (x.stk_dataframe, varargin{:}); for j = 1:(length (x.levels)) x.levels{j} = a(j) + b(j) * x.levels{j}; end end % function %!test %! x = stk_factorialdesign ({[1 2], [5 6]}); %! y = stk_factorialdesign ({[0 1], [0 1]}); %! assert (stk_isequal_tolabs (stk_normalize (x), y)) stk/inst/arrays/@stk_factorialdesign/stk_rescale.m0000644000000000000000000000325413156161544017631 0ustar % STK_RESCALE [overload STK function] % Copyright Notice % % Copyright (C) 2012-2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function [x, a, b] = stk_rescale (x, varargin) if (~ isa (x, 'stk_factorialdesign')) % One of the box arguments is an stk_factorialdesign object stk_error (['stk_factorialdesign objects cannot be used as values ' 'for ''box'' arguments.'], 'TypeMismatch'); end % Rescale using @stk_dataframe/stk_rescale [x.stk_dataframe, a, b] = stk_rescale (x.stk_dataframe, varargin{:}); % Apply the same normalization to levels for j = 1:(length (x.levels)) x.levels{j} = a(j) + b(j) * x.levels{j}; end end % function %!test %! x = stk_factorialdesign ({[1 2], [5 6]}); %! y = stk_factorialdesign ({[0 3], [0 3]}); %! z = stk_rescale (x, [1 5; 2 6], [0 0; 3 3]); %! assert (stk_isequal_tolabs (y, z)) stk/inst/arrays/@stk_factorialdesign/stk_sprintf.m0000644000000000000000000000513413156161544017677 0ustar % STK_SPRINTF ... % Copyright Notice % % Copyright (C) 2013, 2014 SUPELEC % % Authors: Julien Bect % Emmanuel Vazquez % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function s = stk_sprintf (x, verbosity, data_col_width) if (nargin < 2) || (isempty (verbosity)), verbosity = stk_options_get ('stk_dataframe', 'disp_format'); end if ~ ismember (verbosity, {'basic', 'verbose'}) errmsg = 'verbosity should be ''basic'' or ''verbose''.'; stk_error (errmsg, 'InvalidArgument'); end if (nargin < 3) || (isempty (data_col_width)), data_col_width = []; end % Print the stk_dataframe df = x.stk_dataframe; s = stk_sprintf (df, 'basic', data_col_width); % Print the levels first, if in verbose mode if strcmp (verbosity, 'verbose'), spstr = stk_options_get ('stk_dataframe', 'disp_spstr'); L = length (x.levels); s = char (... ... %-------------------------------------------------------------- '.colnames =', ... % alias for .stk_dataframe.colnames horzcat (spstr, stk_sprintf_colnames (df)), ... ... %-------------------------------------------------------------- '.rownames =', ... % alias for .stk_dataframe.rownames horzcat (spstr, stk_sprintf_rownames (df)), ... ... %-------------------------------------------------------------- sprintf ('.levels = <%s>', stk_sprintf_sizetype (x.levels)), ... horzcat (repmat (spstr, L, 1), stk_sprintf_levels (x)), ... ... %-------------------------------------------------------------- '.data =', ... % alias for .stk_dataframe.data horzcat (repmat (spstr, size (s, 1), 1), s) ... ); %--------------------------------------------------------------- end end % function stk/inst/arrays/@stk_factorialdesign/stk_sprintf_levels.m0000644000000000000000000000313213156161544021245 0ustar % STK_SPRINTF_LEVELS prints the levels of a factorial design into a string % Copyright Notice % % Copyright (C) 2013, 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function s = stk_sprintf_levels (x) colnames = get (x.stk_dataframe, 'colnames'); d = length (x.levels); for i = 1:d if isempty (colnames) line{i} = sprintf('levels for column #%d: ', i); else line{i} = sprintf('levels for variable %s: ', colnames{i}); end L = x.levels{i}; if isempty (L) line{i} = [line{i} '[]']; else for j = 1:(length(L) - 1) line{i} = [line{i} num2str(L(j)) ', ']; end line{i} = [line{i} sprintf('%s', num2str(L(end)))]; end end s = char (line{:}); end % function stk/inst/arrays/@stk_factorialdesign/subsasgn.m0000644000000000000000000000343013156161544017153 0ustar % SUBSASGN [overload base function] % Copyright Notice % % Copyright (C) 2017 CentraleSupelec % Copyright (C) 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function x = subsasgn (x, idx, val) if ~ isa (x, 'stk_dataframe') % Inherit behaviour from @stk_dataframe % (see @stk_dataframe/subsasgn.m) x = subsasgn (x, idx, val.stk_dataframe); return end switch idx(1).type case '()' % The result is not an stk_factorialdesign object anymore, in % general. An implicit cast to stk_dataframe is thus performed. x = x.stk_dataframe; x = subsasgn (x, idx, val); case '{}' errmsg = 'Indexing with curly braces is not allowed.'; stk_error(errmsg, 'IllegalIndexing'); case '.' if length (idx) > 1 val = subsasgn (get (x, idx(1).subs), idx(2:end), val); end x = set (x, idx(1).subs, val); end end % function stk/inst/arrays/@stk_factorialdesign/surf.m0000644000000000000000000000226013156161544016305 0ustar % SURF [overload base function] % % See also: stk_factorialdesign/contour, stk_factorialdesign/mesh, ... % Copyright Notice % % Copyright (C) 2016 CentraleSupelec % Copyright (C) 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function h_plot = surf (varargin) h_plot = plot_surfmeshcontour (@surf, varargin{:}); end % function stk/inst/arrays/@stk_factorialdesign/uminus.m0000644000000000000000000000235513156161544016653 0ustar % UMINUS [overload base function] % Copyright Notice % % Copyright (C) 2015 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function x = uminus (x) x.stk_dataframe = - x.stk_dataframe; x.levels = cellfun (@uminus, x.levels, 'UniformOutput', false); end % function %!test %! x = stk_factorialdesign ({1:3, 1:2}); %! y = stk_factorialdesign ({-(1:3), -(1:2)}); %! assert (isequal (-x, y)) stk/inst/arrays/@stk_hrect/0000755000000000000000000000000013156161544013117 5ustar stk/inst/arrays/@stk_hrect/axis.m0000644000000000000000000000407213156161544014244 0ustar % AXIS [overload base function] % Copyright Notice % % Copyright (C) 2016, 2017 CentraleSupelec % Copyright (C) 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function varargout = axis (varargin) [h_axes, varargin, nargin] = stk_plot_getaxesarg (varargin{:}); varargout = cell (1, nargout); labels = {}; for i = 1:nargin a = varargin{i}; if isa (a, 'stk_hrect') df = a.stk_dataframe; % Check number of columns d = size (df, 2); if (d < 2) || (d > 4) stk_error ('axis support 2, 3 or 4 columns only.', 'IncorrectSize'); end % Convert to vector: [XMIN XMAX YMIN YMAX ...] varargin{i} = reshape (double (df), 1, 2 * d); % Get labels tmp = get (df, 'colnames'); if ~ isempty (tmp) labels = tmp(1:(min (3, d))); end end end [varargout{:}] = axis (h_axes, varargin{:}); % Add labels if available if (~ isempty (labels)) stk_xlabel (h_axes, labels{1}, 'interpreter', 'none'); % CG#10 stk_ylabel (h_axes, labels{2}, 'interpreter', 'none'); % CG#10 if (length (labels) > 2) stk_zlabel (h_axes, labels{3}, 'interpreter', 'none'); % CG#10 end end end % function stk/inst/arrays/@stk_hrect/disp.m0000644000000000000000000000202513156161544014233 0ustar % DISP [overload base function] % Copyright Notice % % Copyright (C) 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function disp (hr) disp (hr.stk_dataframe); end % function stk/inst/arrays/@stk_hrect/display.m0000644000000000000000000000224313156161544014743 0ustar % DISPLAY [overload base function] % Copyright Notice % % Copyright (C) 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function display (x) fprintf ( ... '\n%s = %d-dimensional hyper-rectangle (stk_hrect object):\n\n', ... inputname (1), size (x.stk_dataframe, 2)); disp (x); fprintf ('\n'); end % function stk/inst/arrays/@stk_hrect/get.m0000644000000000000000000000302113156161544014050 0ustar % GET [overload base function] % Copyright Notice % % Copyright (C) 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function value = get (x, propname) switch propname case 'lower_bounds' value = x.stk_dataframe.data(1, :); case 'upper_bounds' value = x.stk_dataframe.data(2, :); case 'stk_dataframe' % Read-only access to the underlying df value = x.stk_dataframe; otherwise try value = get (x.stk_dataframe, propname); catch stk_error (sprintf ('There is no field named %s', propname), ... 'InvalidArgument'); end end end % function %#ok<*CTCH> stk/inst/arrays/@stk_hrect/horzcat.m0000644000000000000000000000446213156161544014755 0ustar % HORZCAT [overload base function] % Copyright Notice % % Copyright (C) 2015 CentraleSupelec % Copyright (C) 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function z = horzcat (x, y, varargin) if nargin < 2, z = x; return end if isa (x, 'stk_hrect'), x = x.stk_dataframe; end if isa (y, 'stk_hrect'), y = y.stk_dataframe; end z = horzcat (x, y); try z = stk_hrect (z); catch err = lasterror (); if strcmp (err.identifier, 'STK:stk_hrect:InvalidBounds') warning ('STK:stk_hrect:horzcat:IllegalBounds', ... 'Illegal bounds, the result is not an stk_hrect object.'); else rethrow (err); end end if nargin > 2, z = horzcat (z, varargin{:}); end end % function %#ok<*LERR,*CTCH> %!shared d, x1, x2, x3 %! d = 10; %! x1 = stk_hrect (d); %! x2 = double (x1); %! x3 = [1:d; 0:(d-1)]; % illegal bounds %!test %! y1 = horzcat (x1, x1); %! assert (isequal (size (y1), [2 2*d])); %! assert (strcmp (class (y1), 'stk_hrect')); %!test %! y2 = horzcat (x1, x2); %! assert (isequal (size (y2), [2 2*d])); %! assert (strcmp (class (y2), 'stk_hrect')); %!test %! y3 = horzcat (x2, x1); %! assert (isequal (size (y3), [2 2*d])); %! assert (strcmp (class (y3), 'stk_hrect')); %!test %! lastwarn ('') %! y4 = horzcat (x1, x3); %! assert (isequal (size (y4), [2 2*d])); %! assert (strcmp (class (y4), 'stk_dataframe')); %! [warn_msg, warn_id] = lastwarn (); %! assert (strcmp (warn_id, 'STK:stk_hrect:horzcat:IllegalBounds')) stk/inst/arrays/@stk_hrect/ismember.m0000644000000000000000000000571013156161544015103 0ustar % ISMEMBER [overload base function] % Copyright Notice % % Copyright (C) 2015 CentraleSupelec % Copyright (C) 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function varargout = ismember (A, B, varargin) if isa (B, 'stk_hrect'), % If B is an stk_hrect, ismember tests whether A (or the points in A) % belong to the hyper-rectangle B % The 'rows' flag is tolerated but unused in this case if (nargin > 2) && (~ isequal (varargin, {'rows'})) stk_error ('Invalid additional arguments', 'InvalidArgument'); end if nargout > 1, stk_error (['Cannot return member indices when testing for ' ... 'membership to an hyper-rectangle.'], 'TooManyOutputArgs'); end A = double (A); % bounds = get (B.stk_dataframe, 'data'); bounds = double (B); % even faster than get (..., 'data') b1 = bsxfun (@ge, A, bounds(1, :)); b2 = bsxfun (@le, A, bounds(2, :)); varargout = {all(b1 & b2, 2)}; else % A is an stk_hrect, treat it as any other stk_dataframe would be treated varargout = cell (1, max (nargout, 1)); if nargin == 2, [varargout{:}] = ismember (A.stk_dataframe, B, 'rows'); else try % At least of of the arguments (A or B) is an stk_hrect, % therefore ismember should work on rows flags = unique ([{'rows'} varargin{:}]); catch if ~ all (cellfun (@ischar, varargin)) stk_error ('Invalid flag (should be a string).', ... 'InvalidArgument'); else rethrow (lasterror ()); end end [varargout{:}] = ismember (A.stk_dataframe, B, flags{:}); end end end % function %!shared n, box %! n = 5; %! box = stk_hrect (n); %!assert (ismember (box(1, :), box)) %!assert (ismember (box(2, :), box)) %!assert (ismember (.5 * ones (1, 5), box)) %!assert (~ ismember (box(1, :) - 1, box)) %!assert (~ ismember (box(2, :) + 1, box)) %!test %! y = double (box); y = [y; y + 2]; %! assert (isequal (ismember (y, box), [1; 1; 0; 0])) stk/inst/arrays/@stk_hrect/stk_boundingbox.m0000644000000000000000000000265013156161544016477 0ustar % STK_BOUNDINGBOX [overload STK function] % Copyright Notice % % Copyright (C) 2015 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function box = stk_boundingbox (x) if nargin > 1, stk_error ('Too many input arguments.', 'TooManyInputArgs'); end % An stk_hrect object is its own bounding box box = x; end % function %!shared x, y %! lb = rand (1, 5); %! ub = lb + 1; %! cn = {'a', 'b', 'c', 'd', 'e'}; %! x = stk_hrect ([lb; ub], cn); %!error y = stk_boundingbox (); %!test y = stk_boundingbox (x); %!error y = stk_boundingbox (x, 1); %!assert (isequal (y, x)); stk/inst/arrays/@stk_hrect/stk_dataframe.m0000644000000000000000000000534113156161544016105 0ustar % @STK_HRECT/STK_DATAFRAME [overload STK function] % % See also: stk_dataframe % Copyright Notice % % Copyright (C) 2017 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function x = stk_dataframe (x, colnames, rownames) x = x.stk_dataframe; if nargin > 1 % Note: [] means "keep x.colnames" while {} means "no column names" if iscell (colnames) x = set (x, 'colnames', colnames); elseif ~ isempty (colnames) stk_error (['colnames should be either a cell array ' ... 'of strings or [].'], 'InvalidArgument'); end if nargin > 2 % Note: [] means "keep x.rownames" while {} means "no row names" if iscell (rownames) x = set (x, 'rownames', rownames); elseif ~ isempty (rownames) stk_error (['rownames should be either a cell array ' ... 'of strings or [].'], 'InvalidArgument'); end end end end % function %!shared x, cn, rn, y, cn2, rn2 %! cn = {'x' 'y'}; %! rn = {'lower_bounds'; 'upper_bounds'}; %! x = stk_hrect ([0 0; 1 1], cn); %! cn2 = {'xx' 'yy'}; %! rn2 = {'aa'; 'bb'}; %!test y = stk_dataframe (x); %!assert (strcmp (class (y), 'stk_dataframe')) %!assert (isequal (y.colnames, cn)) %!assert (isequal (y.rownames, rn)) %!test y = stk_dataframe (x, cn2); %!assert (strcmp (class (y), 'stk_dataframe')) %!assert (isequal (y.colnames, cn2)) %!assert (isequal (y.rownames, rn)) %!test y = stk_dataframe (x, cn2, rn2); %!assert (strcmp (class (y), 'stk_dataframe')) %!assert (isequal (y.colnames, cn2)) %!assert (isequal (y.rownames, rn2)) %!test y = stk_dataframe (x, [], rn2); %!assert (strcmp (class (y), 'stk_dataframe')) %!assert (isequal (y.colnames, cn)) %!assert (isequal (y.rownames, rn2)) %!test y = stk_dataframe (x, {}, rn2); %!assert (strcmp (class (y), 'stk_dataframe')) %!assert (isequal (y.colnames, {})) %!assert (isequal (y.rownames, rn2)) stk/inst/arrays/@stk_hrect/stk_hrect.m0000644000000000000000000000701713156161544015270 0ustar % STK_HRECT creates an hyper-rectangle object % % CALL: B = stk_hrect (D) % CALL: B = stk_hrect (D, COLNAMES) % % creates an object representing a D-dimensional unit hypercube, [0; 1] ^ D. % % The second (optional) argument can be used to provide variable names. % % CALL: B = stk_hrect (X) % CALL: B = stk_hrect (X, COLNAMES) % % creates an object representing a D-dimensional hyperrectangle with lower % bounds X(1, :) and upper bounds X(2, :). The input X must be a 2xD % numerical array. % % NOTE: class hierarchy % % An stk_hrect object is two-row stk_dataframe object, with row names % 'lower_bounds' and 'upper_bounds'. % % See also: stk_dataframe, stk_boundingbox % Copyright Notice % % Copyright (C) 2015, 2017 CentraleSupelec % Copyright (C) 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function s = stk_hrect (arg1, colnames) if nargin > 2 stk_error ('Too many input arguments.', 'TooManyInputArgs'); elseif nargin == 0 % Default constructor df = stk_dataframe (); s = class (struct (), 'stk_hrect', df); return elseif isa (arg1, 'stk_hrect') % arg1 is already an stk_hrect object: copy s = arg1; else % create a new stk_hrect object % NOTE: the following test uses (prod (size (arg1)) == 1) instead of % isscalar because isscalar (x) means (numel (x) == 1) in Octave 3.8.2 % and therefore always returns true for stk_dataframe objects. if (prod (size (arg1)) == 1) % arg1 is the dimension of the input space % => create a default hyper-rectangle [0; 1]^d, with d = arg1 d = arg1; box_data = repmat ([0; 1], 1, d); box_colnames = {}; else if isa (arg1, 'stk_dataframe') box_colnames = get (arg1, 'colnames'); else box_colnames = {}; end box_data = double (arg1); d = size (box_data, 2); if (~ isequal (size (box_data), [2 d])) stk_error ('Invalid size: should be 2 x dim.', 'IncorrectSize'); end end if (~ all (box_data(1, :) <= box_data(2, :))) stk_error ('Invalid bounds', 'InvalidBounds'); end df = stk_dataframe (box_data, ... box_colnames, {'lower_bounds', 'upper_bounds'}); s = class (struct (), 'stk_hrect', df); end % column names if nargin > 1 s.stk_dataframe = set (s.stk_dataframe, 'colnames', colnames); end end % function %#ok<*PSIZE> %!test stk_test_class ('stk_hrect') %!shared dom %!test dom = stk_hrect ([-1; 1], {'x'}); %!assert (isequal (dom.colnames, {'x'})) %!assert (isequal (dom.rownames, {'lower_bounds'; 'upper_bounds'})) %!assert (isequal (dom.data, [-1; 1])) stk/inst/arrays/@stk_hrect/stk_normalize.m0000644000000000000000000000427713156161544016170 0ustar % STK_NORMALIZE [overload STK function] % Copyright Notice % % Copyright (C) 2015 CentraleSupelec % Copyright (C) 2012-2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function [x, a, b] = stk_normalize (x, box) if nargin > 2, stk_error ('Too many input arguments.', 'TooManyInputArgs'); end if nargin < 2, box = []; end % Read argument x x_data = double (x); d = size (x_data, 2); % Ensure that box is an stk_hrect object if ~ isa (box, 'stk_hrect') if isempty (box) box = stk_boundingbox (x_data); % Default: bounding box else box = stk_hrect (box); end end % Read argument box box_data = double (box.stk_dataframe); if ~ isequal (size (box_data), [2 d]) errmsg = sprintf ('box should have size [2 d], with d=%d.', d); stk_error (errmsg, 'IncorrectSize'); end xmin = box_data(1, :); % lower_bounds xmax = box_data(2, :); % upper_bounds b = 1 ./ (xmax - xmin); a = - xmin .* b; x(:) = bsxfun (@plus, a, x_data * diag (b)); end % function %!shared x, box, y1, y2, y3, y4 %! n = 5; box = stk_hrect ([2; 3]); %! x = 2 + rand (n, 1); %!error y1 = stk_normalize (); %!test y2 = stk_normalize (x); %!test y3 = stk_normalize (x, box); %!error y4 = stk_normalize (x, box, log (2)); %!test assert (~ any ((y2 < -10 * eps) | (y2 > 1 + 10 * eps))); %!test assert (~ any ((y3 < -10 * eps) | (y3 > 1 + 10 * eps))); stk/inst/arrays/@stk_hrect/stk_rescale.m0000644000000000000000000000625713156161544015606 0ustar % STK_RESCALE [overload STK function] % Copyright Notice % % Copyright (C) 2017 CentraleSupelec % Copyright (C) 2012-2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function [x, a, b] = stk_rescale (x, box1, box2) if nargin > 3 stk_error ('Too many input arguments.', 'TooManyInputArgs'); end % Read argument x x_data = double (x); d = size (x_data, 2); box1_data = double (box1); if isempty (box1_data) % Speed up the case where box1 is empty b1 = 1; a1 = 0; else % Ensure that box1 is an stk_hrect object, or can be converted to one % (note: this checks that lower bounds are smaller than upper bounds) if ~ isa (box1, 'stk_hrect') box1 = stk_hrect (box1); %#ok end % Check the number of columns if size (box1_data, 2) ~= d errmsg = sprintf ('box1 should have size [2 d], with d=%d.', d); stk_error (errmsg, 'IncorrectSize'); end % Scale to [0; 1] (xx --> zz) xmin = box1_data(1, :); xmax = box1_data(2, :); b1 = 1 ./ (xmax - xmin); a1 = - xmin .* b1; end box2_data = double (box2); if isempty (box2_data) % Speed up the case where box2 is empty b2 = 1; a2 = 0; else % Ensure that box2 is an stk_hrect object, or can be converted to one % (note: this checks that lower bounds are smaller than upper bounds) if ~ isa (box2, 'stk_hrect') box2 = stk_hrect (box2); %#ok end % Check the number of columns if size (box2_data, 2) ~= d errmsg = sprintf ('box2 should have size [2 d], with d=%d.', d); stk_error (errmsg, 'IncorrectSize'); end % scale to box2 (zz --> yy) ymin = box2_data(1, :); ymax = box2_data(2, :); b2 = ymax - ymin; a2 = ymin; end b = b2 .* b1; a = a2 + a1 .* b2; x(:) = bsxfun (@plus, a, bsxfun (@times, x_data, b)); end % function %#ok<*CTCH> %!shared x %! x = rand (10, 4); %! y = stk_rescale (x, [], []); %! assert (stk_isequal_tolabs (x, y)); %!test %! y = stk_rescale(0.5, [], [0; 2]); %! assert (stk_isequal_tolabs (y, 1.0)); %!test %! y = stk_rescale (0.5, [0; 1], [0; 2]); %! assert (stk_isequal_tolabs (y, 1.0)); %!test %! y = stk_rescale (0.5, [0; 2], []); %! assert (stk_isequal_tolabs (y, 0.25)); %!test %! y = stk_rescale (0.5, [0; 2], [0; 1]); %! assert (stk_isequal_tolabs (y, 0.25)); stk/inst/arrays/@stk_hrect/subsasgn.m0000644000000000000000000000266713156161544015135 0ustar % SUBSASGN [overload base function] % Copyright Notice % % Copyright (C) 2017 CentraleSupelec % Copyright (C) 2013, 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function x = subsasgn (x, idx, value) if isa (x, 'stk_hrect') x.stk_dataframe = subsasgn (x.stk_dataframe, idx, value); data = double (x); if any (data(1, :) > data(2, :)) stk_error ('Lower bounds cannot be larger than upperbounds', ... 'IllegalAssigment'); end else % value must be an stk_hrect object x = subsasgn (x, idx, x.stk_dataframe); end end % function stk/inst/arrays/@stk_hrect/subsref.m0000644000000000000000000000361713156161544014755 0ustar % SUBSREF [overload base function] % Copyright Notice % % Copyright (C) 2015 CentraleSupelec % Copyright (C) 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function t = subsref (x, idx) switch idx(1).type case '()' t = subsref (x.stk_dataframe, idx); if size (t, 1) == 2 x.stk_dataframe = t; t = x; end case '{}' % Currently {}-indexing is not supported for % stk_dataframe objects, but who knows... t = subsref (x.stk_dataframe, idx); case '.' t = get (x, idx(1).subs); if length (idx) > 1, t = subsref (t, idx(2:end)); end end end % function %!test %! B = stk_hrect ([0 0 0 0; 1 2 3 4]); %! B = B(:, [1 3 4]); %! assert (strcmp (class (B), 'stk_hrect')); %! assert (isequal (double (B), [0 0 0; 1 3 4])); %!test %! B = stk_hrect ([0 0 0 0; 1 2 3 4]); %! B = B(1, :); %! assert (strcmp (class (B), 'stk_dataframe')); %! assert (isequal (double (B), [0 0 0 0])); stk/inst/arrays/@stk_hrect/vertcat.m0000644000000000000000000000312313156161544014744 0ustar % VERTCAT [overload base function] % Copyright Notice % % Copyright (C) 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function result = vertcat (varargin) for i = 1:nargin, if isa (varargin{i}, 'stk_hrect') varargin{i} = varargin{i}.stk_dataframe; end end result = vertcat (varargin{:}); end % function %!shared d, x, y %! d = 10; %! x = stk_hrect (d); %! y = double (x); %!test %! z = vertcat (x, x); %! assert (isequal (size (z), [4 d])); %! assert (strcmp (class (z), 'stk_dataframe')); %!test %! z = vertcat (x, y); %! assert (isequal (size (z), [4 d])); %! assert (strcmp (class (z), 'stk_dataframe')); %!test %! z = vertcat (y, x); %! assert (isequal (size (z), [4 d])); %! assert (strcmp (class (z), 'stk_dataframe')); stk/inst/arrays/generic/0000755000000000000000000000000013156161544012445 5ustar stk/inst/arrays/generic/stk_boundingbox.m0000644000000000000000000000363013156161544016024 0ustar % STK_BOUNDINGBOX constructs the bounding box for a set of points % % CALL: B = stk_boundingbox (X) % % returns the bounding box of X, defined as: % % B = [min(X); max(X)]. % % The result is an stk_hrect object. % % See also: stk_hrect % Copyright Notice % % Copyright (C) 2015, 2017 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function box = stk_boundingbox (x) if nargin > 1, stk_error ('Too many input arguments.', 'TooManyInputArgs'); end if ~ isnumeric (x) stk_error (['The input argument should be a ' ... 'numeric array.'], 'TypeMismatch'); elseif ndims (x) ~= 2 %#ok see CODING_GUDELINES stk_error (['Arrays with more than two dimensions are ' ... 'not supported.'], 'IncorrectSize'); end xmin = min (x, [], 1); xmax = max (x, [], 1); box = stk_hrect ([xmin; xmax]); end % function %!shared x, y, cn %! cn = {'a', 'b', 'c'}; %! x = [0 3 2; 1 4 1; 7 0 2]; %!error y = stk_boundingbox (); %!test y = stk_boundingbox (x); %!error y = stk_boundingbox (x, 1); %!assert (isequal (y.data, [0 0 1; 7 4 2])); stk/inst/arrays/generic/stk_commonsize.m0000644000000000000000000000405113156161544015667 0ustar % STK_COMMONSIZE ... % % TODO: describe differences with Octave's common_size function. % Copyright Notice % % Copyright (C) 2015 CentraleSupelec % Copyright (C) 2013, 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function varargout = stk_commonsize (varargin) n = length (varargin); if n == 0, varargout = {}; else if n == 1 % varargin{1} is expected to be a cell array in this case C = varargin{1}; n = length (C); else C = varargin; end d = cellfun (@ndims, C); s = ones (n, max (d)); for i = 1:n, s(i, 1:d(i)) = size (C{i}); end smax = max (s); % Take care of empty dimensions, if any b = (smax > 0); smax = smax (b); s = s(:, b); nrep = ones (size (smax)); for i = 1:n, nrep(b) = smax ./ s(i, :); nrep_one = (nrep == 1); if ~ all ((s(i, :) == 1) | nrep_one) error ('Input arguments cannot be brought to a common size.'); elseif ~ all (nrep_one) C{i} = repmat (C{i}, nrep); end end if nargout > 1, varargout = C(1:nargout); else varargout = {C}; end end end % function stk/inst/arrays/generic/stk_feval.m0000644000000000000000000002700413156161544014604 0ustar % STK_FEVAL evaluates a function at given evaluation points % % CALL: Z = stk_feval (F, X) % % evaluates the function F on the evaluation points X, where % % * F can be either a function handle or a function name (string), % or a cell-array of function handles or names, and % * X can be either a numerical array or an stk_dataframe object. % % The output Z contains the evaluation results. The number of rows of Z is % the same as the number of rows of X. % % * If F is a single function (name of handle) that returns row vectors with % J elements, then Z has J columns and Z(i, :) is equal to F(X(i, :)). % * If F is a cell-array of functions (names or handles), where F{k} returns % row vectors J_k elements, then Z has J = J_1 + ... + J_K elements, and % Z(i, :) is equal to [F{1}(X(i, :)) ... F{K}(X(i, :))]. % % This two-argument form assumes that F supports vectorized evaluations. % % EXAMPLE: % % f = {@sin, @cos}; % x = stk_sampling_regulargrid (100, 1, [0; 2*pi]); % x.colnames = {'x'}; % y = stk_feval (f, x); % plot (x, y); % % CALL: Z = stk_feval (F, X, DISPLAY_PROGRESS) % % displays progress messages if DISPLAY_PROGRESS is true, and does the same % as the previous form otherwise. Displaying a progress message is useful if % each evaluation of F requires a significant computation time. % % This three-argument form assumes that F supports vectorized evaluations if % DISPLAY_PROGRESS is false, and performs evaluations one by one otherwise. % % NOTE: output type % % The output of stk_feval is an stk_dataframe object if X is, with the same % row names and with column names determined automatically. Otherwise, the % type of the output of stk_feval is determined by the type of the output of % each function that is evaluated (together with the usual rules for concate- % nating arrays of different types, if necessary). % % CALL: Z = stk_feval (F, X, DISPLAY_PROGRESS, DF_OUT) % % returns an stk_dataframe output if DF_OUT is true (even if X is not an % stk_dataframe object itself), and let the usual concatenation rules % determine the output type otherwise (even if X is an stk_dataframe). % % CALL: Z = stk_feval (F, X, DISPLAY_PROGRESS, DF_OUT, VECTORIZED) % % controls whether function evaluations are performed in a "vectorized" manner % (i.e., all rows at once) or one row after the other. This form can be used % to override the default rules explained above. Vectorized evaluations are % usually faster but some functions do not support them. % % See also feval % Copyright Notice % % Copyright (C) 2015, 2017 CentraleSupelec % Copyright (C) 2011-2014 SUPELEC % % Authors: Julien Bect % Emmanuel Vazquez % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function z = stk_feval (f, x, progress_msg, df_out, vectorized) if nargin > 5, stk_error ('Too many input arguments.', 'TooManyInputArgs'); end % Check 'progress_msg' argument if (nargin < 3) || (isempty (progress_msg)), progress_msg = false; else progress_msg = logical (progress_msg); end % Check 'df_out' argument if (nargin < 4) || (isempty (df_out)), % Default: type stability df_out = isa (x, 'stk_dataframe'); else df_out = logical (df_out); end % Check 'vectorized' argument if (nargin < 5) || (isempty (vectorized)), % Default: use vectorized evaluations, unless progress_msg is true vectorized = ~ progress_msg; else vectorized = logical (vectorized); end % Turn f into a cell (if it isn't already one) if ~ iscell (f), f = {f}; end % Number of functions numfcs = numel (f); % Check f and extract function names if df_out fname = cell (size (f)); truncated_fname = false (size (f)); for k = 1:numfcs, if ischar (f{k}), fname{k} = f{k}; else try fname{k} = func2str (f{k}); catch fname{k} = sprintf ('F%d', k); end end % Truncate long function names if (length (fname{k})) > 15 fname{k} = sprintf ('F%d', k); truncated_fname(k) = true; end end end % Extract numeric data xdata = double (x); % Zero-dimensional inputs are not allowed [n, d] = size (xdata); if d == 0, error ('zero-dimensional inputs are not allowed.'); end % Each function can have several outputs => we will try to recover meaningful % column names by looking at these outputs and store them in: if df_out fcolnames = cell (1, numfcs); end if n == 0, % no input => no output z = zeros (0, numfcs); else % at least one input point output_dim = zeros (1, numfcs); if vectorized %--- Vectorized calls ---------------------------------------- z = cell (1, numfcs); for k = 1:numfcs z{k} = feval (f{k}, xdata); % Check output size if (size (z{k}, 1) ~= size (xdata, 1)) stk_error (['The size of the output is incorrect. Perhaps ' ... 'the function does not support vectorized ' ... 'evaluations.'], 'IncorrectSize'); end % Guess output dimension output_dim(k) = size (z{k}, 2); % Guess column names if df_out && (isa (z{k}, 'stk_dataframe')) fcolnames{k} = z{k}.colnames; end end else %--- Unvectorized calls: n == 1 -------------------------------------- % First evaluation: figure out the dimension of the output if progress_msg, stk_disp_progress ('feval %d/%d... ', 1, n); end z1 = []; for k = 1:numfcs % Get the evaluation result % (at this point, we don't know the size or type of zdata{k}) z1_k = feval (f{k}, xdata(1, :)); % Guess output dimension output_dim(k) = size (z1_k, 2); % Concatenate try z1 = [z1 double(z1_k)]; %#ok catch if ~ isequal (size (z1_k), [1 output_dim(k)]) stk_error (['The output of F{j} should be a scalar or ' ... 'a row vector'], 'IncorrectSize'); else rethrow (lasterror); end end % Guess column names if df_out && (isa (z1_k, 'stk_dataframe')) fcolnames{k} = z1_k.colnames; end end end % if vectorized % Begin/end indices for each block of columns j_end = cumsum (output_dim); j_beg = 1 + [0 j_end(1:end-1)]; if vectorized %--- Vectorized calls ---------------------------------------- % Concatenate function outputs z = horzcat (z{:}); else %--- Unvectorized calls: n > 1 --------------------------------------- % Prepare for subsequent evaluations z = zeros (n, j_end(end)); z(1, :) = z1; if n > 1, % Subsequent evaluations for i = 2:n, if progress_msg, stk_disp_progress ('feval %d/%d... ', i, n); end for k = 1:numfcs z(i, (j_beg(k):j_end(k))) = feval (f{k}, xdata(i, :)); end end end % if n > 1 end % if vectorized end % if n == 0 %--- Create column names ------------------------------------------------------- if df_out colnames = cell (1, size (z, 2)); for k = 1:numfcs if ~ isempty (fcolnames{k}) % We have column names, let's use them % Special case: only one function, % without a nice short displayable name if (numfcs == 1) && truncated_fname(1) prefix = ''; else prefix = [fname{1} '_']; end colnames(j_beg(k):j_end(k)) = cellfun (... @(u)(sprintf ('%s%s', prefix, u)), fcolnames{k}, ... 'UniformOutput', false); elseif output_dim(k) == 1 % Only one column and no column names colnames{j_beg(k)} = fname{k}; else % General case: several columns but no column names colnames(j_beg(k):j_end(k)) = arrayfun (... @(u)(sprintf ('%s_%d', fname{k}, u)), 1:output_dim(k), ... 'UniformOutput', false); end end end %--- Create output stk_dataframe object ---------------------------------------- if df_out if isa (x, 'stk_dataframe'), rownames = x.rownames; else rownames = {}; end z = stk_dataframe (z, colnames, rownames); end end % function %#ok<*CTCH,*LERR> %!shared f, xt %! f = @(x)(- (0.7 * x + sin (5 * x + 1) + 0.1 * sin (10 * x))); %! xt = stk_sampling_regulargrid (20, 1, [0; 1]); %!error yt = stk_feval (); %!error yt = stk_feval (f); %!test yt = stk_feval (f, xt); %!test yt = stk_feval (f, xt, false); %!test yt = stk_feval (f, xt, false, false); %!test yt = stk_feval (f, xt, false, false, false); %!error yt = stk_feval (f, xt, false, false, false, pi^2); %!test %! N = 15; %! xt = stk_sampling_regulargrid (N, 1, [0; 1]); %! yt = stk_feval (f, xt); %! assert (isequal (size (yt), [N 1])); %!test %! x = stk_dataframe ([1; 2; 3], {'x'}, {'a'; 'b'; 'c'}); %! y = stk_feval (@(u)(2 * u), x); %! assert (isequal (y.data, [2; 4; 6])); %! assert (isequal (y.rownames, {'a'; 'b'; 'c'})); %!shared t, z_ref, n %! n = 20; %! t = stk_sampling_regulargrid (n, 1, [0; 2*pi]); %! z_ref = [sin(t.data) cos(t.data)]; %!test %! t.colnames = {'time'}; %! z = stk_feval ({@sin, @cos}, t); %! assert (isa (z, 'stk_dataframe')); %! assert (isequal (z.data, z_ref)); %!test %! F = @(x)([sin(x) cos(x)]); %! z = stk_feval (F, t); %! assert (isequal (z.data, z_ref)); %!test %! t = stk_sampling_regulargrid (n, 1, [0; 2*pi]); %! F = {'sin', 'cos'}; %! z = stk_feval (F, t); %! assert (isequal (z.data, [sin(t.data) cos(t.data)])); %! assert (isequal (z.colnames, {'sin' 'cos'})); %!test % vectorized %! F = @(t)([sin(t) cos(t)]); %! G = @(t)(0.365 * t.^2 + (cos ((t - 1).*(t - 2) + 0.579033))); %! z = stk_feval ({@sin, @cos, G, F, 'tan'}, t); %! assert (isequal (z.colnames, {'sin' 'cos' 'F3' 'F4_1' 'F4_2' 'tan'})); %!test % not vectorized %! F = @(t)([sin(t) cos(t)]); %! G = @(t)(0.365 * t^2 + (cos ((t - 1)*(t - 2) + 0.579033))); %! z = stk_feval ({@sin, @cos, G, F, 'tan'}, t, [], [], false); %! assert (isequal (z.colnames, {'sin' 'cos' 'F3' 'F4_1' 'F4_2' 'tan'})); stk/inst/arrays/generic/stk_length.m0000644000000000000000000000273113156161544014770 0ustar % STK_LENGTH return the "length" of an array % % CALL: L = stk_length (X) % % returns the "length" of the data array X. % % NOTE: % % Currently, the length of a data array (numeric array or stk_dataframe % object) is defined as SIZE (X, 1) but this might change in future % versions of STK. Note that this is not the same as length (X). % Copyright Notice % % Copyright (C) 2014 SUPELEC % % Authors: Julien Bect % Emmanuel Vazquez % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function l = stk_length (x) l = size (x, 1); end % function %!assert (isequal (stk_length ([1 2; 3 4; 5 6]), 3)); stk/inst/arrays/generic/stk_normalize.m0000644000000000000000000000333213156161544015505 0ustar % STK_NORMALIZE normalizes a dataset to [0; 1] ^ DIM % Copyright Notice % % Copyright (C) 2012-2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function [x, a, b] = stk_normalize (x, box, varargin) if nargin < 2, box = []; end % Ensure that box is an stk_hrect object if ~ isa (box, 'stk_hrect') if isempty (box), box = stk_boundingbox (x); else box = stk_hrect (box); end end % Call @stk_hrect/stk_normalize [x, a, b] = stk_normalize (x, box, varargin{:}); end % function %!shared x, box, y1, y2, y3, y4 %! n = 5; box = [2; 3]; x = box(1) + diff (box) * rand (n, 1); %!error y1 = stk_normalize (); %!test y2 = stk_normalize (x); %!test y3 = stk_normalize (x, box); %!error y4 = stk_normalize (x, box, log (2)); %!test assert (~ any ((y2 < -10 * eps) | (y2 > 1 + 10 * eps))); %!test assert (~ any ((y3 < -10 * eps) | (y3 > 1 + 10 * eps))); stk/inst/arrays/generic/stk_rescale.m0000644000000000000000000000352613156161544015130 0ustar % STK_RESCALE rescales a dataset from one box to another % Copyright Notice % % Copyright (C) 2012-2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function [x, a, b] = stk_rescale (x, box1, varargin) % Convert box1 to an stk_hrect object % (we know that box1 is not an stk_hrect object, otherwise % we wouldn't have ended up here) if isempty (box1) box1 = stk_hrect (size (x, 2)); % Default: [0; 1] ^ DIM else box1 = stk_hrect (box1); end % Call @stk_hrect/stk_rescale [x, a, b] = stk_rescale (x, box1, varargin{:}); end % function %!shared x %! x = rand (10, 4); %! y = stk_rescale (x, [], []); %! assert (stk_isequal_tolabs (x, y)); %!test %! y = stk_rescale(0.5, [], [0; 2]); %! assert (stk_isequal_tolabs (y, 1.0)); %!test %! y = stk_rescale (0.5, [0; 1], [0; 2]); %! assert (stk_isequal_tolabs (y, 1.0)); %!test %! y = stk_rescale (0.5, [0; 2], []); %! assert (stk_isequal_tolabs (y, 0.25)); %!test %! y = stk_rescale (0.5, [0; 2], [0; 1]); %! assert (stk_isequal_tolabs (y, 0.25)); stk/inst/arrays/generic/stk_sprintf.m0000644000000000000000000000461513156161544015177 0ustar % STK_SPRINTF prints the content of an array into a string % Copyright Notice % % Copyright (C) 2017 CentraleSupelec % Copyright (C) 2013, 2014 SUPELEC % % Authors: Julien Bect % Emmanuel Vazquez % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function s = stk_sprintf (x, verbosity, data_col_width) % verbosity will be ignored, but let's check that it's a legal value anyway if (nargin > 1) && (~ ismember (verbosity, {'basic', 'verbose'})) errmsg = 'verbosity should be ''basic'' or ''verbose''.'; stk_error (errmsg, 'InvalidArgument'); end % Only the case of numeric array is handled here if ~ isnumeric (x) errmsg = sprintf ('Incorrect argument type: %s', class (x)); stk_error (errmsg, 'IncorrectType'); end x = double (x); [n, d] = size (x); if (n == 0) || (d == 0) s = '[] (empty)'; else if (nargin < 2) || isempty (data_col_width) switch stk_disp_getformat () case 'short' data_col_width = 6; case 'long' data_col_width = 16; otherwise % FIXME: handle other formatting modes... data_col_width = 10; end end nb_spaces_colsep = 2; s = repmat ('', n, 1); %#ok<*AGROW> for j = 1:d xx = stk_sprintf_colvect (x(:, j), data_col_width); s = [s xx]; % formatted data if j < d % column separator s = [s repmat(' ', n, nb_spaces_colsep)]; end end % for end % if end % function %#ok<*CTCH> stk/inst/arrays/generic/stk_sprintf_colnames.m0000644000000000000000000000264313156161544017057 0ustar % STK_SPRINTF_COLNAMES returns the column names of an array % Copyright Notice % % Copyright (C) 2013 SUPELEC % % Authors: Julien Bect % Emmanuel Vazquez % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function s = stk_sprintf_colnames (x) if ~ isnumeric (x) errmsg = sprintf ('Incorrect argument type: %s', class (x)); stk_error (errmsg, 'IncorrectType'); else n = size (x, 1); if n == 1 s = sprintf ('{} (unnamed column)'); else s = sprintf ('{} (unnamed columns)'); end end end % function stk/inst/arrays/generic/stk_sprintf_rownames.m0000644000000000000000000000263213156161544017107 0ustar % STK_SPRINTF_ROWNAMES returns the row names of an array % Copyright Notice % % Copyright (C) 2013 SUPELEC % % Authors: Julien Bect % Emmanuel Vazquez % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function s = stk_sprintf_rownames (x) if ~ isnumeric (x) errmsg = sprintf ('Incorrect argument type: %s', class (x)); stk_error (errmsg, 'IncorrectType'); else n = size (x, 1); if n == 1 s = sprintf ('{} (unnamed row)'); else s = sprintf ('{} (unnamed rows)'); end end end % function stk/inst/arrays/generic/stk_sprintf_sizetype.m0000644000000000000000000000270613156161544017132 0ustar % STK_SPRINTF_SIZETYPE prints the size and type into a string % Copyright Notice % % Copyright (C) 2015 CentraleSupelec % Copyright (C) 2013, 2014 SUPELEC % % Authors: Julien Bect % Emmanuel Vazquez % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function s = stk_sprintf_sizetype (x) if (isscalar (x)) && (isobject (x)) s = sprintf ('%s object', class (x)); else t = size (x); s = ''; for i = 1:(length(t) - 1), s = [s sprintf('%dx', t(i))]; %#ok end s = [s sprintf('%d %s array', t(end), class (x))]; end end % function stk/inst/core/0000755000000000000000000000000013156161544010460 5ustar stk/inst/core/@stk_kreq_qr/0000755000000000000000000000000013156161544013105 5ustar stk/inst/core/@stk_kreq_qr/disp.m0000644000000000000000000000202613156161544014222 0ustar % DISP [overload base function] % Copyright Notice % % Copyright (C) 2015 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function disp (x) disp (struct (x)); end % function stk/inst/core/@stk_kreq_qr/display.m0000644000000000000000000000215313156161544014731 0ustar % DISPLAY [overload base function] % Copyright Notice % % Copyright (C) 2015 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function display (x) fprintf ('\n%s = <%s>\n\n', inputname (1), stk_sprintf_sizetype (x)); disp (x); fprintf ('\n'); end % function stk/inst/core/@stk_kreq_qr/get.m0000644000000000000000000000732113156161544014045 0ustar % GET [STK internal] % % CALL: value = get (kreq, propname) % % implements 'get' for stk_kreq_qr objects. % Copyright Notice % % Copyright (C) 2015, 2017 CentraleSupelec % Copyright (C) 2013, 2014 SUPELEC % % Author: Julien Bect % Emmanuel Vazquez % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function value = get (kreq, propname) switch propname case {'n', 'r', 'P_scaling', 'LS_Q', 'LS_R', 'RS', 'lambda_mu'} value = kreq.(propname); case 'lambda' value = kreq.lambda_mu(1:kreq.n, :); case 'mu' value = kreq.lambda_mu((kreq.n + 1):end, :); case 'delta_var' value = dot (kreq.lambda_mu, kreq.RS, 1)'; case 'log_abs_det_kriging_matrix' % LS_Q has +/- 1 determinant, so we only need to care about LS_R value = sum (log (abs (diag (kreq.LS_R)))); case 'log_det_covariance_matrix_a' n = kreq.n; Q11 = kreq.LS_Q(1:n, 1:n); R11 = kreq.LS_R(1:n, 1:n); value = log (det (Q11 * R11)); % K = Q11 * R11 % note: this method seems much less accurate than the others, % we strongly recommend to avoid using it case 'log_det_covariance_matrix_b' n = kreq.n; Q11 = kreq.LS_Q(1:n, 1:n); R11 = kreq.LS_R(1:n, 1:n); Kchol = stk_cholcov (Q11 * R11); % K = Q11 * R11 value = 2 * sum (log (diag (Kchol))); case 'log_det_covariance_matrix_c' % note: very efficient (but not the best) and quite simple to understand n = kreq.n; Q11 = kreq.LS_Q(1:n, 1:n); diag_R = diag (kreq.LS_R); logdet1 = log (abs (det (Q11))); logdet2 = sum (log (abs (diag_R(1:n)))); value = logdet1 + logdet2; case {'log_det_covariance_matrix', 'log_det_covariance_matrix_d'} % note: this is the fastest of all five solutions for large matrices % (for small matrices, the difference is negligible)... but also % the trickiest ! n = kreq.n; QL = kreq.LS_Q((n + 1):end, :); % lowerpart of LS_Q diag_R = diag (kreq.LS_R); logdet1 = sum (log (abs (diag_R))); T = kreq.LS_R \ (QL'); logdet2 = log (abs (det (T((n + 1):end, :)))); value = logdet1 + logdet2; case 'log_det_covariance_matrix_e' % note: the most time consuming of all five solutions (blame qrdelete), % we strongly recommend to avoid using it n = kreq.n; r = kreq.r; Q = kreq.LS_Q; R = kreq.LS_R; for i = 0:(r - 1) [Q, R] = qrdelete (Q, R, n + r - i, 'row'); [Q, R] = qrdelete (Q, R, n + r - i, 'col'); end value = sum (log (abs (diag (R)))); otherwise error ('There is no property called ''%s''.', propname); end % switch end % function stk/inst/core/@stk_kreq_qr/isequal.m0000644000000000000000000000276213156161544014735 0ustar % ISEQUAL [overload base function] % Copyright Notice % % Copyright (C) 2017 CentraleSupelec % Copyright (C) 2013, 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . % INTERNAL NOTE: overloaded for Octave 3.2.x compat / see CODING_GUIDELINES function b = isequal (x, y, varargin) if nargin < 2 stk_error ('Not enough input arguments.', 'NotEnoughInputArgs'); end % First, make sure that x and y belong to the same class % (either stk_dataframe or some derived class) b = isa (x, 'stk_kreq_qr') && strcmp (class (y), class (x)) ... && isequal (struct (x), struct (y)); if b && (nargin > 2) b = isequal (x, varargin{:}); end end % function stk/inst/core/@stk_kreq_qr/linsolve.m0000644000000000000000000000255213156161544015122 0ustar % LINSOLVE [STK internal] % % CALL: w = linsolve (kreq, rs) % % Overload base function 'linsolve' for stk_kreq_qr objects. % Copyright Notice % % Copyright (C) 2011-2014 SUPELEC % % Authors: Julien Bect % Emmanuel Vazquez % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function w = linsolve (kreq, rs) if nargin < 2, rs = kreq.RS; end % Solves the linear equation A * ws = rs, where A is the kriging matrix w = linsolve (kreq.LS_R, kreq.LS_Q' * rs, struct ('UT', true)); end % function stk/inst/core/@stk_kreq_qr/private/0000755000000000000000000000000013156161544014557 5ustar stk/inst/core/@stk_kreq_qr/private/compute_P_scaling.m0000644000000000000000000000217413156161544020374 0ustar % COMPUTE_P_SCALING [STK internal] % Copyright Notice % % Copyright (C) 2014 SUPELEC % % Authors: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function s = compute_P_scaling (Kii, Pi) t = sum (Pi .^ 2); s = ones (1, size (Pi, 2)); s(t > 0) = sqrt ((max (sum (Kii .^ 2))) ./ t(t > 0)); end % function stk/inst/core/@stk_kreq_qr/stk_kreq_qr.m0000644000000000000000000000410613156161544015611 0ustar % STK_KREQ_QR [STK internal] % % CALL: kreq = stk_kreq_qr (model, xi, xt) % % constructs an stk_kreq_qr object. % Copyright Notice % % Copyright (C) 2016, 2017 CentraleSupelec % Copyright (C) 2013, 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function kreq = stk_kreq_qr (model, xi, xt) if nargin == 0 kreq = struct ('n', 0, 'r', 0, 'P_scaling', [], ... 'LS_Q', [], 'LS_R', [], 'RS', [], 'lambda_mu', []); else [Kii, Pi] = stk_make_matcov (model, xi); [n, r] = size (Pi); % heuristics: scale Pi to (try to) avoid conditioning issues later P_scaling = compute_P_scaling (Kii, Pi); Pi = bsxfun (@times, Pi, P_scaling); % kriging matrix (left-hand side of the kriging equation) LS = [[Kii, Pi]; [Pi', zeros(r)]]; % orthogonal-triangular decomposition [Q, R] = qr (LS); kreq = struct ('n', n, 'r', r, 'P_scaling', P_scaling, ... 'LS_Q', Q, 'LS_R', R, 'RS', [], 'lambda_mu', []); end kreq = class (kreq, 'stk_kreq_qr'); % prepare the right-hand side of the kriging equation if nargin > 2, [Kti, Pt] = stk_make_matcov (model, xt, xi); kreq = stk_set_righthandside (kreq, Kti, Pt); end end % function %!test stk_test_class ('stk_kreq_qr') stk/inst/core/@stk_kreq_qr/stk_set_righthandside.m0000644000000000000000000000303113156161544017631 0ustar % STK_SET_RIGHTHANDSIDE [STK internal] % % CALL: kreq = stk_set_righthandside (kreq, Kti, Pt) % % sets the right-hand side for an stk_kreq_qr object. % Copyright Notice % % Copyright (C) 2013, 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function kreq = stk_set_righthandside (kreq, Kti, Pt) % This class implements GREEDY EVALUATION: computations are made as soon as the % required inputs are made available. % prepare the right-hand side of the kriging equation Pt = bsxfun (@times, Pt, kreq.P_scaling); kreq.RS = [Kti Pt]'; % Solve the kriging equation to get the extended % kriging weights vector (weights + Lagrange multipliers) kreq.lambda_mu = linsolve (kreq); end % function stk/inst/core/@stk_kreq_qr/stk_squared_seminorm.m0000644000000000000000000000306513156161544017525 0ustar % STK_SQUARED_SEMINORM [STK internal] % % CALL: s = stk_squared_seminorm (kreq, zi) % % computes the squared semi-norm associated to the left-hand side of an % stk_kreq_qr object. % Copyright Notice % % Copyright (C) 2013, 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function s = stk_squared_seminorm (kreq, zi) % Extend the observation vector with zeros zz = [double(zi); zeros(kreq.r, 1)]; % Compute the squared seminorm s = zz' * (linsolve (kreq, zz)); % % Alternative (slower) implementation: % ni = size (kreq.LS_Q, 1) - kreq.r; % zi = double (zi); % QU = kreq.LS_Q(1:ni, :); % T = kreq.LS_R \ (QU' * zi); % s = zi' * T(1:ni, :); % Guard against numerical issues if s < 0, s = 0; end end % function stk/inst/core/@stk_kreq_qr/stk_update.m0000644000000000000000000000532313156161544015431 0ustar % STK_UPDATE [STK internal] % % CALL: kreq = stk_update (kreq, Kjj, Kji, Pj, Ktj) % % Experimental... % Copyright Notice % % Copyright (C) 2015 CentraleSupelec % Copyright (C) 2013, 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function kreq = stk_update (kreq, Kjj, Kji, Pj, Ktj) % Poor man's update... % TODO: implement efficient update equations (use qrinsert) LS = kreq.LS_Q * kreq.LS_R; Kii = LS(1:kreq.n, 1:kreq.n); Pi = bsxfun (@rdivide, LS(1:kreq.n, (kreq.n + 1):end), kreq.P_scaling); Kii = [[Kii Kji']; [Kji Kjj]]; Pi = [Pi; Pj]; old_scaling = kreq.P_scaling; kreq.P_scaling = compute_P_scaling (Kii, Pi); Pi = bsxfun (@times, Pi, kreq.P_scaling); LS = [[Kii Pi]; [Pi' zeros(kreq.r)]]; [kreq.LS_Q, kreq.LS_R] = qr (LS); if ~ isempty (kreq.RS) Kti = kreq.RS(1:kreq.n, :)'; Pt = bsxfun (@rdivide, kreq.RS((kreq.n + 1):end, :)', old_scaling); kreq = stk_set_righthandside (kreq, [Kti Ktj], Pt); elseif nargin > 4 stk_error ('Too many input arguments: no RS to update', 'TooManyInputArgs'); end kreq.n = kreq.n + size (Kjj, 1); end % function %!shared model, x, y %! model = stk_model ('stk_materncov32_iso', 1); %! model.param = log ([1.0; 2.8]); %! x = [1.2; 0.3; -1.9]; %! y = 0.0; %!test %! kreqA = stk_kreq_qr (model, x); %! [Kii, Pi] = stk_make_matcov (model, x); %! kreqB = stk_kreq_qr (model, x(1)); %! kreqB = stk_update (kreqB, Kii(2, 2), Kii(2, 1), Pi(2)); %! kreqB = stk_update (kreqB, Kii(3, 3), Kii(3, [1 2]), Pi(3)); %! assert (stk_isequal_tolabs (kreqA, kreqB, 3 * eps)) %!test %! kreqA = stk_kreq_qr (model, x, y); %! [Kii, Pi] = stk_make_matcov (model, x); %! [Kti, Pt] = stk_make_matcov (model, y, x); %! kreqB = stk_kreq_qr (model, x(1), y); %! kreqB = stk_update (kreqB, Kii(2, 2), Kii(2, 1), Pi(2), Kti(2)); %! kreqB = stk_update (kreqB, Kii(3, 3), Kii(3, [1 2]), Pi(3), Kti(3)); %! assert (stk_isequal_tolabs (kreqA, kreqB, 3 * eps)) stk/inst/core/@stk_kreq_qr/subsref.m0000644000000000000000000000254613156161544014743 0ustar % SUBSREF [STK internal] % % CALL: value = subsref (kreq, idx) % % implements 'subsref' for stk_kreq_qr objects. % % See also: subsref % Copyright Notice % % Copyright (C) 2013, 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function value = subsref (kreq, idx) if strcmp (idx(1).type, '.') value = get (kreq, idx(1).subs); if length(idx) > 1, value = subsref(value, idx(2:end)); end else stk_error('Illegal indexing.', 'IllegalIndexing'); end end % function stk/inst/core/@stk_model_gpposterior/0000755000000000000000000000000013156161544015176 5ustar stk/inst/core/@stk_model_gpposterior/disp.m0000644000000000000000000000375013156161544016320 0ustar % DISP [overload base function] % Copyright Notice % % Copyright (C) 2015-2017 CentraleSupelec % % Authors: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function disp (model) loose_spacing = stk_disp_isloose (); fprintf ('<%s>\n', stk_sprintf_sizetype (model)); if loose_spacing fprintf ('|\n'); end if ~ isscalar (model) return end if isempty (model.prior_model) str_prior_model = '--'; else str_prior_model = ['<' stk_sprintf_sizetype(model.prior_model) '>']; end if size (model.input_data, 1) == 0 str_input_data = '--'; else str_input_data = ['<' stk_sprintf_sizetype(model.input_data) '>']; end if size (model.output_data, 1) == 0 str_output_data = '--'; else str_output_data = ['<' stk_sprintf_sizetype(model.output_data) '>']; end fprintf ('| prior_model: %s\n', str_prior_model); fprintf ('| input_data: %s\n', str_input_data); fprintf ('| output_data: %s\n', str_output_data); if loose_spacing fprintf ('|\n\n'); end if ~ isempty (model.prior_model) fprintf ('with .prior_model =\n'); if loose_spacing fprintf ('\n'); end disp (model.prior_model); end end % function stk/inst/core/@stk_model_gpposterior/display.m0000644000000000000000000000223713156161544017025 0ustar % DISPLAY [overload base function] % Copyright Notice % % Copyright (C) 2015, 2017 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function display (x) name = inputname (1); if isempty (name) name = 'ans'; end if stk_disp_isloose fprintf ('\n'); end fprintf ('%s = ', name); disp (x); end % function stk/inst/core/@stk_model_gpposterior/fieldnames.m0000644000000000000000000000227313156161544017467 0ustar % FIELDNAMES [overload base function] % Copyright Notice % % Copyright (C) 2016 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function fn = fieldnames (model) fn = {'prior_model'; 'input_data'; 'output_data'}; % Note: kreq is a 'hidden' field that might change in future versions of STK, % we don't want ordinary users to see it end % function stk/inst/core/@stk_model_gpposterior/get.m0000644000000000000000000000346113156161544016137 0ustar % GET [overload base function] % Copyright Notice % % Copyright (C) 2015, 2016 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function value = get (model, propname) switch propname case {'prior_model', 'input_data', 'output_data', 'kreq'} % rem: kreq is a hidden property value = model.(propname); otherwise if ~ ischar (propname) errmsg = 'Invalid property name.'; else errmsg = sprintf ('There is no field named %s.', propname); end stk_error (errmsg, 'InvalidArgument'); end % switch end % function %#ok<*CTCH,*LERR> %!shared M_post %! x_obs = (linspace (0, pi, 15))'; %! z_obs = sin (x_obs); %! M_prior = stk_model ('stk_materncov32_iso'); %! M_prior.param = log ([1.0; 2.1]); %! M_post = stk_model_gpposterior (M_prior, x_obs, z_obs); %!error value = get (M_post, 1.33); %!error value = get (M_post, 'dudule'); %!test value = get (M_post, 'prior_model'); stk/inst/core/@stk_model_gpposterior/get_input_data.m0000644000000000000000000000213113156161544020340 0ustar % GET_INTPUT_DATA returns the input data of the model % Copyright Notice % % Copyright (C) 2015, 2016 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function input_data = get_input_data (model) input_data = model.input_data; end % function stk/inst/core/@stk_model_gpposterior/get_output_data.m0000644000000000000000000000213613156161544020546 0ustar % GET_OUTPUT_DATA returns the output data of the model % Copyright Notice % % Copyright (C) 2015, 2016 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function output_data = get_output_data (model) output_data = model.output_data; end % function stk/inst/core/@stk_model_gpposterior/get_prior_model.m0000644000000000000000000000212513156161544020526 0ustar % GET_PRIOR_MODEL returns the prior_model structure % Copyright Notice % % Copyright (C) 2016 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function prior_model = get_prior_model (model) prior_model = model.prior_model; end % function stk/inst/core/@stk_model_gpposterior/horzcat.m0000644000000000000000000000224113156161544017025 0ustar % HORZCAT [overload base function] % Copyright Notice % % Copyright (C) 2015 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function varargout = horzcat (varargin) stk_error (['Arrays of stk_model_gpposterior objects are not supported. ', ... 'Use cell arrays instead.'], 'IllegalOperation'); end % function stk/inst/core/@stk_model_gpposterior/isequal.m0000644000000000000000000000330113156161544017014 0ustar % ISEQUAL [overload base function] % Copyright Notice % % Copyright (C) 2017 CentraleSupelec % Copyright (C) 2013, 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . % INTERNAL NOTE: overloaded for Octave 3.2.x compat / see CODING_GUIDELINES function b = isequal (x, y, varargin) if nargin < 2 stk_error ('Not enough input arguments.', 'NotEnoughInputArgs'); end % First, make sure that x and y belong to the same class % (either stk_dataframe or some derived class) b = isa (x, 'stk_model_gpposterior') && strcmp (class (y), class (x)) ... && isequal (x.prior_model, y.prior_model) ... && isequal (x.input_data, y.input_data) ... && isequal (x.output_data, y.output_data) ... && isequal (x.kreq, y.kreq); if b && (nargin > 2) b = isequal (x, varargin{:}); end end % function stk/inst/core/@stk_model_gpposterior/set.m0000644000000000000000000000501013156161544016143 0ustar % SET [overload base function] % Copyright Notice % % Copyright (C) 2016 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function model = set (model, propname, value) switch propname case 'prior_model' stk_error (sprintf (['Property prior_model is read-only.\n\nHINT: ' ... 'Construct a new stk_model_gpposterior object if you need to ' ... 'change the prior model.']), 'ReadOnlyProperty'); case 'kreq' % rem: kreq is a hidden property stk_error (sprintf (['Property kreq is a hidden, read-only ' ... 'property.\n\nHINT: Don''t try to set kreq directly. It will ' ... 'be updated automatically whenever it is needed.']), ... 'ReadOnlyProperty'); case {'input_data', 'output_data'} stk_error (sprintf (['Property %s is read-only.\n\nHINT: Use ' ... 'stk_model_update to add new evaluations results ' ... 'to an existing stk_model_gpposterior object.'], ... propname), 'ReadOnlyProperty'); otherwise if ~ ischar (propname) errmsg = 'Invalid property name.'; else errmsg = sprintf ('There is no field named %s.', propname); end stk_error (errmsg, 'InvalidArgument'); end % switch end % function %#ok<*CTCH,*LERR> %!shared M_post %! x_obs = (linspace (0, pi, 15))'; %! z_obs = sin (x_obs); %! M_prior = stk_model ('stk_materncov32_iso'); %! M_prior.param = log ([1.0; 2.1]); %! M_post = stk_model_gpposterior (M_prior, x_obs, z_obs); %!error value = get (M_post, 1.33); %!error value = get (M_post, 'dudule'); %!test value = get (M_post, 'prior_model'); stk/inst/core/@stk_model_gpposterior/stk_generate_samplepaths.m0000644000000000000000000000455013156161544022434 0ustar % STK_GENERATE_SAMPLEPATHS [overload STK function] % Copyright Notice % % Copyright (C) 2017 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function zsim = stk_generate_samplepaths (model, varargin) switch nargin case {0, 1} stk_error ('Not enough input arguments.', 'NotEnoughInputArgs'); case 2 % CALL: ZSIM = stk_generate_samplepaths (MODEL, XT) xt = varargin{1}; nb_paths = 1; conditional = false; case 3 % CALL: ZSIM = stk_generate_samplepaths (MODEL, XT, NB_PATHS) xt = varargin{1}; nb_paths = varargin{2}; conditional = false; case 4 % CALL: ZSIM = stk_generate_samplepaths (MODEL, XI, ZI, XT) xi = varargin{1}; zi = varargin{2}; xt = varargin{3}; nb_paths = 1; conditional = true; case 5 % CALL: ZSIM = stk_generate_samplepaths (MODEL, XI, ZI, XT, NB_PATHS) xi = varargin{1}; zi = varargin{2}; xt = varargin{3}; nb_paths = varargin{4}; conditional = true; otherwise stk_error ('Too many input arguments.', 'TooManyInputArgs'); end if ~ isa (model, 'stk_model_gpposterior') stk_error ('Syntax error.', 'SyntaxError'); end if conditional model = stk_model_update (model, xi, zi); end xi = get_input_data (model); zi = get_output_data (model); model = get_prior_model (model); zsim = stk_generate_samplepaths (model, xi, zi, xt, nb_paths); end % function stk/inst/core/@stk_model_gpposterior/stk_isnoisy.m0000644000000000000000000000216513156161544017736 0ustar % STK_ISNOISY [overload STK function] % Copyright Notice % % Copyright (C) 2016 CentraleSupelec & LNE % % Authors: Julien Bect % Rémi Stroh % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function b = stk_isnoisy (model) b = stk_isnoisy (model.prior_model); end % function stk/inst/core/@stk_model_gpposterior/stk_make_kreq.m0000644000000000000000000000237713156161544020205 0ustar % STK_MAKE_KREQ [STK internal] % Copyright Notice % % Copyright (C) 2017 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function kreq = stk_make_kreq (M_post, x) % Create prior cross-covariance matrix (and design matrix at x) [Kti, Pt] = stk_make_matcov (M_post.prior_model, x, M_post.input_data); % Create full kriging equation object kreq = stk_set_righthandside (M_post.kreq, Kti, Pt); end % function stk/inst/core/@stk_model_gpposterior/stk_model_gpposterior.m0000644000000000000000000001074413156161544022000 0ustar % STK_MODEL_GPPOSTERIOR constructs a posterior model % Copyright Notice % % Copyright (C) 2015-2017 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function model = stk_model_gpposterior (prior_model, xi, zi) if nargin == 3 if iscell (xi) % Legacy support for experimental hidden feature, to be removed kreq = xi{2}; xi = xi{1}; else kreq = []; end % Check the size of zi n = size (xi, 1); if ~ (isempty (zi) || isequal (size (zi), [n 1])) stk_error (['zi must either be empty or have the ' ... 'same number of rows as x_obs.'], 'IncorrectSize'); end % Currently, prior models are represented exclusively as structures if ~ isstruct (prior_model) stk_error (['Input argument ''prior_model'' must be a ' ... 'prior model structure.'], 'InvalidArgument'); end % Make sure that lognoisevariance is -inf for noiseless models if ~ stk_isnoisy (prior_model) prior_model.lognoisevariance = -inf; end % Backward compatibility: % accept model structures with missing 'dim' field if (~ isfield (prior_model, 'dim')) || (isempty (prior_model.dim)) prior_model.dim = size (xi, 2); elseif ~ isempty (xi) && (prior_model.dim ~= size (xi, 2)) stk_error (sprintf (['The number of columns of xi (which is %d) ' ... 'is different from the value of prior_model.dim (which is ' ... '%d).'], size (xi, 2), prior_model.dim), 'InvalidArgument'); end % Check prior_model.lognoisevariance if ~ isscalar (prior_model.lognoisevariance) if (~ isvector (prior_model.lognoisevariance)) && (length ... (prior_model.lognoisevariance) == n) stk_error (['M_prior.lognoisevariance must be either ' ... 'a scalar or a vector of length size (xi, 1).'], ... 'InvalidArgument'); end % Make sure that lnv is a column vector prior_model.lognoisevariance = prior_model.lognoisevariance(:); end % Check if the covariance model contains parameters % that must be estimated first if (isnumeric (prior_model.param)) && (any (isnan (prior_model.param))) prior_model.param = stk_param_estim (prior_model, xi, zi); end % Compute QR factorization if isempty (kreq) kreq = stk_kreq_qr (prior_model, xi); end elseif nargin == 0 prior_model = []; xi = []; zi = []; kreq = []; else stk_error ('Incorrect number of input arguments.', 'SyntaxError'); end % Prepare object fields model.prior_model = prior_model; model.input_data = xi; model.output_data = zi; model.kreq = kreq; % Create object model = class (model, 'stk_model_gpposterior'); end % function %!test stk_test_class ('stk_model_gpposterior') %!shared M_prior, x_obs, z_obs %! x_obs = (linspace (0, pi, 15))'; %! z_obs = sin (x_obs); %! %! M_prior = stk_model ('stk_materncov32_iso'); %! M_prior.param = log ([1.0; 2.1]); %!test M_post = stk_model_gpposterior (); %!test M_post = stk_model_gpposterior (M_prior, x_obs, z_obs); %!error M_post = stk_model_gpposterior (M_prior, x_obs, [z_obs; z_obs]); %!error M_post = stk_model_gpposterior (M_prior, x_obs, [z_obs; z_obs], 3.441); %!test % hidden feature %! kreq = stk_kreq_qr (M_prior, x_obs); %! M_post = stk_model_gpposterior (M_prior, {x_obs, kreq}, z_obs); %!test % NaNs in prior_model.param %! DIM = 1; M = stk_model (@stk_materncov52_aniso, DIM); %! M.param = nan (2, 1); % this is currently the default %! x = stk_sampling_regulargrid (20, DIM, [0; 1]); %! y = sin (double (x)); %! zp = stk_predict (M, x, y, x); stk/inst/core/@stk_model_gpposterior/stk_model_update.m0000644000000000000000000000750513156161544020706 0ustar % STK_MODEL_UPDATE [overload STK function] % Copyright Notice % % Copyright (C) 2016 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function M = stk_model_update (M, x_new, z_new, lnv_new) lnv_current = M.prior_model.lognoisevariance; if nargin < 4 % lnv not provided (homoscedastic case only) if ~ isscalar (lnv_current) stk_error (sprintf (['The fourth input argument is mandatory when ' ... 'updating an heteroscedastic model.\n\nPlease use\n' ... '\n M = stk_model_update (M, X_NEW, Z_NEW, LNV_NEW)\n\n'... 'to provide the value LNV_NEW of the lognoisevariance at the ' ... 'new observations points X_NEW.']), 'NotEnoughInputArguments'); end heteroscedastic = false; elseif ~ isempty (lnv_new) % lnv provided (heteroscedastic case only) if (size (M.input_data, 1) ~= 1) && (isscalar (lnv_current)) if lnv_current == -inf, s1 = 'a noiseless'; s2 = 'noiseless'; else s1 = 'an homoscedastic'; s2 = 'homoscedastic'; end stk_error (sprintf (['The fourth input argument should not be used ' ... 'when updating %s model.\n\nPlease use\n\n M = stk_model_' ... 'update (M, X_NEW, Z_NEW)\nor M = stk_model_update (M, X_NEW, ' ... 'Z_NEW, [])\n\nto update your %s model M with new data (X_NEW, ' ... 'Z_NEW).'], s1, s2), 'NotEnoughInputArguments'); end % Make sure that lnv is a column vector lnv_new = lnv_new(:); heteroscedastic = true; end M.input_data = [M.input_data; x_new]; M.output_data = [M.output_data; z_new]; if heteroscedastic M.prior_model.lognoisevariance = [lnv_current; lnv_new]; end % FIXME: use @stk_kreq/stk_update ? M.kreq = stk_kreq_qr (M.prior_model, M.input_data); end % function %!shared x_obs, z_obs, ref, M_prior, x_new, z_new, lnv_new %! [x_obs, z_obs, ref] = stk_dataset_twobumps ('noisy2'); %! M_prior = stk_model ('stk_materncov52_iso'); %! M_prior.param = [-0.15; 0.38]; %! M_prior.lognoisevariance = 2 * log (ref.noise_std); %! x_new = [-0.79; -0.79]; %! z_new = [-0.69; -0.85]; %! lnv_new = ref.noise_std_func (x_new); %!test % heteroscedastic %! M_prior.lognoisevariance = 2 * log (ref.noise_std); %! M_post = stk_model_gpposterior (M_prior, x_obs, z_obs); %! M_post = stk_model_update (M_post, x_new, z_new, lnv_new); %!error % using lnv_new / homoscedastic %! M_prior.lognoisevariance = 0; %! M_post = stk_model_gpposterior (M_prior, x_obs, z_obs); %! M_post = stk_model_update (M_post, x_new, z_new, lnv_new); % NOT OK %!error % using lnv_new / noiseless %! M_prior.lognoisevariance = -inf; %! M_post = stk_model_gpposterior (M_prior, x_obs, z_obs) %! M_post = stk_model_update (M_post, x_new, z_new, lnv_new); % NOT OK %!error % not using lnv_new / heteroscedastic %! M_prior.lognoisevariance = 2 * log (ref.noise_std); %! M_post = stk_model_gpposterior (M_prior, x_obs, z_obs); %! M_post = stk_model_update (M_post, x_new, z_new); stk/inst/core/@stk_model_gpposterior/stk_predict.m0000644000000000000000000001750113156161544017673 0ustar % STK_PREDICT [overload STK function] % Copyright Notice % % Copyright (C) 2015-2017 CentraleSupelec % Copyright (C) 2011-2014 SUPELEC % % Authors: Julien Bect % Emmanuel Vazquez % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function [zp, lambda, mu, K] = stk_predict (M_post, xt) if nargin > 2 stk_error ('Too many input arguments.', 'TooManyInputArgs'); end % TODO: these should become options block_size = []; M_prior = M_post.prior_model; %--- Convert and check input arguments: xt ------------------------------------- xt = double (xt); % FIXME: check variable names if (strcmp (M_prior.covariance_type, 'stk_discretecov')) && (isempty (xt)) % In this case, predict on all points of the underlying discrete space nt = size (M_prior.param.K, 1); xt = (1:nt)'; else nt = size (xt, 1); if length (size (xt)) > 2 stk_error (['The input argument xt should not have more than two ' ... 'dimensions'], 'IncorrectSize'); elseif ~ isequal (size (xt), [nt M_prior.dim]) stk_error (sprintf (['The number of columns of xt (which is %d) ' ... 'does not agree with the dimension of the model (which is ' ... '%d).'], size (xt, 2), M_prior.dim), 'IncorrectSize'); end end %--- Prepare the output arguments ---------------------------------------------- zp_v = zeros (nt, 1); compute_prediction = ~ isempty (M_post.output_data); % compute the kriging prediction, or just the variances ? if compute_prediction zp_a = zeros (nt, 1); else zp_a = nan (nt, 1); end %--- Choose nb_blocks & block_size --------------------------------------------- n_obs = size (M_post.input_data, 1); if isempty (block_size) MAX_RS_SIZE = 5e6; SIZE_OF_DOUBLE = 8; % in bytes block_size = ceil (MAX_RS_SIZE / (n_obs * SIZE_OF_DOUBLE)); end if nt == 0 % skip main loop nb_blocks = 0; else % blocks of size approx. block_size nb_blocks = max (1, ceil (nt / block_size)); block_size = ceil (nt / nb_blocks); end % The full lambda_mu matrix is only needed when nargout > 1 if nargout > 1 lambda_mu = zeros (n_obs + get (M_post.kreq, 'r'), nt); end % The full RS matrix is only needed when nargout > 3 if nargout > 3 RS = zeros (size (lambda_mu)); end %--- MAIN LOOP (over blocks) --------------------------------------------------- % TODO: this loop should be parallelized !!! for block_num = 1:nb_blocks % compute the indices for the current block idx_beg = 1 + block_size * (block_num - 1); idx_end = min (nt, idx_beg + block_size - 1); idx = idx_beg:idx_end; % solve the kriging equation for the current block xt_ = xt(idx, :); kreq = stk_make_kreq (M_post, xt_); % compute the kriging mean if compute_prediction zp_a(idx) = (get (kreq, 'lambda'))' * (double (M_post.output_data)); end % The full lambda_mu matrix is only needed when nargout > 1 if nargout > 1 lambda_mu(:, idx) = get (kreq, 'lambda_mu'); end % The full RS matrix is only needed when nargout > 3 if nargout > 3 RS(:, idx) = get (kreq, 'RS'); end % compute kriging variances (this does NOT include the noise variance) zp_v(idx) = stk_make_matcov (M_prior, xt_, xt_, true) ... - get (kreq, 'delta_var'); % note: the following modification computes prediction variances for noisy % variance, i.e., including the noise variance also % zp_v(idx) = stk_make_matcov (M_prior, xt_, [], true) ... % - get (kreq, 'delta_var'); b = (zp_v < 0); if any (b) zp_v(b) = 0.0; warning('STK:stk_predict:NegativeVariancesSetToZero', sprintf ( ... ['Correcting numerical inaccuracies in kriging variance.\n' ... '(%d negative variances have been set to zero)'], sum (b))); end end %--- Ensure exact prediction at observation points for noiseless models -------- if ~ stk_isnoisy (M_prior) % FIXME: Fix the kreq object instead ? xi = double (M_post.input_data); zi = double (M_post.output_data); [b, loc] = ismember (xt, xi, 'rows'); if sum (b) > 0 if compute_prediction zp_a(b) = zi(loc(b)); end zp_v(b) = 0.0; if nargout > 1 lambda_mu(:, b) = 0.0; lambda_mu(sub2ind (size (lambda_mu), loc(b), find (b))) = 1.0; end end end %--- Prepare outputs ----------------------------------------------------------- zp = stk_dataframe ([zp_a zp_v], {'mean' 'var'}); if nargout > 1 % lambda requested lambda = lambda_mu(1:n_obs, :); end if nargout > 2 % mu requested mu = lambda_mu((n_obs+1):end, :); end if nargout > 3 K0 = stk_make_matcov (M_prior, xt, xt); deltaK = lambda_mu' * RS; K = K0 - 0.5 * (deltaK + deltaK'); end end % function %#ok<*SPWRN> %!shared n, m, M_post, M_prior, x0, x_obs, z_obs, x_prd, y_prd, idx_obs, idx_prd %! %! n = 10; % number of observations %! m = n + 1; % number of predictions %! d = 1; % dimension of the input space %! %! x0 = (linspace (0, pi, n + m))'; %! %! idx_obs = (2:2:(n+m-1))'; %! idx_prd = (1:2:(n+m))'; %! %! x_obs = x0(idx_obs); %! z_obs = sin (x_obs); %! x_prd = x0(idx_prd); %! %! M_prior = stk_model ('stk_materncov32_iso'); %! M_prior.param = log ([1.0; 2.1]); %! %! M_post = stk_model_gpposterior (M_prior, x_obs, z_obs); %!error y_prd = stk_predict (M_post); %!test y_prd = stk_predict (M_post, x_prd); %!error y_prd = stk_predict (M_post, [x_prd x_prd]); %!error y_prd = stk_predict (M_post, x_prd, 0); %!test % nargout = 2 %! [y_prd1, lambda] = stk_predict (M_post, x_prd); %! assert (stk_isequal_tolrel (y_prd, y_prd1)); %! assert (isequal (size (lambda), [n m])); %!test % nargout = 3 %! [y_prd1, lambda, mu] = stk_predict (M_post, x_prd); %! assert (stk_isequal_tolrel (y_prd, y_prd1)); %! assert (isequal (size (lambda), [n m])); %! assert (isequal (size (mu), [1 m])); % ordinary kriging %!test % nargout = 4 %! [y_prd1, lambda, mu, K] = stk_predict (M_post, x_prd); %! assert (stk_isequal_tolrel (y_prd, y_prd1)); %! assert (isequal (size (lambda), [n m])); %! assert (isequal (size (mu), [1 m])); % ordinary kriging %! assert (isequal (size (K), [m m])); %!test % nargout = 2, compute only variances %! M_post1 = stk_model_gpposterior (M_prior, x_obs, []); %! [y_prd_nan, lambda] = stk_predict (M_post1, x_prd); %! assert (isequal (size (lambda), [n m])); %! assert (all (isnan (y_prd_nan.mean))); %!test % discrete model (prediction indices provided) %! M_prior1 = stk_model ('stk_discretecov', M_prior, x0); %! M_post1 = stk_model_gpposterior (M_prior1, idx_obs, z_obs); %! y_prd1 = stk_predict (M_post1, idx_prd); %! assert (stk_isequal_tolrel (y_prd, y_prd1)); %!test % discrete model (prediction indices *not* provided) %! M_prior1 = stk_model ('stk_discretecov', M_prior, x0); %! M_post1 = stk_model_gpposterior (M_prior1, idx_obs, z_obs); %! y_prd1 = stk_predict (M_post1, []); % predict them all! %! assert (stk_isequal_tolrel (y_prd, y_prd1(idx_prd, :))); stk/inst/core/@stk_model_gpposterior/stk_predict_leaveoneout.m0000644000000000000000000000761013156161544022301 0ustar % STK_PREDICT_LEAVEONEOUT [overload STK function] % Copyright Notice % % Copyright (C) 2017 CentraleSupelec % Copyright (C) 2017 LNE % % Authors: Remi Stroh % Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function [LOO_pred, LOO_res] = stk_predict_leaveoneout (M_post) if nargin > 1 stk_error ('Too many input arguments.', 'TooManyInputArgs'); end prior_model = M_post.prior_model; % Compute the covariance matrix, and the trend matrix % (this covariance matrix K takes the noise into account) [K, P] = stk_make_matcov (prior_model, M_post.input_data); simple_kriging = (size (P, 2) == 0); % If simple kriging, just compute the inverse covariance matrix if simple_kriging R = inv (K); else % Use a more complex formula ("virtual cross-validation") P_K = P' / K; R = K \ (eye (size (K)) - P * ((P_K * P) \ P_K)); % I = inv (K); % R = I - I * P * (inv (P' * I * P)) * P' * I; end dR = diag (R); % The diagonal of the LOO matrix % Mean zi = M_post.output_data; raw_res = R * zi ./ dR; % Compute "raw" residuals zp_mean = zi - raw_res; % LOO prediction % Variance noisevariance = exp (M_post.prior_model.lognoisevariance); zp_var = max (0, 1 ./ dR - noisevariance); LOO_pred = stk_dataframe (horzcat (zp_mean, zp_var), {'mean', 'var'}); % Compute residuals ? if nargout ~= 1 % Compute normalized residual % norm_res = (zi - zp_mean) ./ (sqrt (noisevariance + zp_var)); norm_res = (sqrt (dR)) .* raw_res; % Pack results into a dataframe LOO_res = stk_dataframe (horzcat (raw_res, norm_res), ... {'residuals', 'norm_res'}); end % Create LOO cross-validation plots? if nargout == 0 % Plot predictions VS observations (left planel)... stk_subplot (1, 2, 1); stk_plot_predvsobs (M_post.output_data, LOO_pred); % ...and normalized residuals (right panel) stk_subplot (1, 2, 2); stk_plot_histnormres (LOO_res.norm_res); end end % function %!test % Check virtual Leave-One-Out formula %! %! n = 20; d = 1; %! x_obs = stk_sampling_regulargrid (n, d, [0; 2*pi]); %! z_obs = stk_feval (@sin, x_obs); %! %! lm_list = {stk_lm_null, stk_lm_constant, stk_lm_affine}; %! %! for j = 0:2 %! for k = 1:(length (lm_list)) %! %! model = stk_model ('stk_materncov32_iso', d); %! model.lm = lm_list{k}; %! model.param = log ([1; 5]); %! %! switch j % test various scenarios for lognoisevariance %! case 0 %! model.lognoisevariance = -inf; %! case 1 %! model.lognoisevariance = 0; %! case 2 %! model.lognoisevariance = (1 + rand (n, 1)) * 1e-3; %! end %! %! M_post = stk_model_gpposterior (model, x_obs, z_obs); %! %! [loo_pred, loo_res] = stk_predict_leaveoneout (M_post); %! [direct_pred, direct_res] = stk_predict_leaveoneout_direct (M_post); %! %! assert (stk_isequal_tolrel (loo_pred, direct_pred)); %! assert (stk_isequal_tolrel (loo_res, direct_res)); %! %! end %! end stk/inst/core/@stk_model_gpposterior/stk_predict_leaveoneout_direct.m0000644000000000000000000000533013156161544023630 0ustar % STK_PREDICT_LEAVEONEOUT_DIRECT [STK internal] % Copyright Notice % % Copyright (C) 2016, 2017 CentraleSupelec % % Author: Julien Bect % Stefano Duhamel % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function [LOO_pred, LOO_res] = stk_predict_leaveoneout_direct (M_post) % Heteroscedatic noise ? heteroscedastic = ~ isscalar (M_post.prior_model.lognoisevariance); n = size (M_post.input_data, 1); zp_mean = zeros (n, 1); zp_var = zeros (n, 1); prior_model = M_post.prior_model; for i = 1:n xx = M_post.input_data; xx(i, :) = []; xt = M_post.input_data(i, :); zz = M_post.output_data; zz(i, :) = []; % In the heteroscedastic case, the vector of log-variances for the % noise is stored in prior_model.lognoisevariance. This vector must be % modified too, when performing cross-validation. if heteroscedastic prior_model = M_post.prior_model; prior_model.lognoisevariance(i) = []; end zp = stk_predict (prior_model, xx, zz, xt); zp_mean(i) = zp.mean; zp_var(i) = zp.var; end % Prepare outputs LOO_pred = stk_dataframe ([zp_mean zp_var], {'mean', 'var'}); % Compute residuals ? if nargout ~= 1 % Compute "raw" residuals raw_res = M_post.output_data - zp_mean; % Compute normalized residual noisevariance = exp (M_post.prior_model.lognoisevariance); norm_res = raw_res ./ (sqrt (noisevariance + zp_var)); % Pack results into a dataframe LOO_res = stk_dataframe ([raw_res norm_res], ... {'residuals', 'norm_res'}); end % Create LOO cross-validation plots? if nargout == 0 % Plot predictions VS observations (left planel)... stk_subplot (1, 2, 1); stk_plot_predvsobs (M_post.output_data, LOO_pred); % ...and normalized residuals (right panel) stk_subplot (1, 2, 2); stk_plot_histnormres (LOO_res.norm_res); end end % function stk/inst/core/@stk_model_gpposterior/subsasgn.m0000644000000000000000000000261413156161544017204 0ustar % SUBSASGN [overload base function] % Copyright Notice % % Copyright (C) 2016 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function model = subsasgn (model, idx, value) switch idx(1).type case '.' if length (idx) > 1 value = subsasgn (get (model, idx(1).subs), idx(2:end), value); end model = set (model, idx(1).subs, value); case {'{}', '()'} errmsg = 'Illegal assignment'; stk_error (errmsg, 'IllegalAssignment'); end end % function stk/inst/core/@stk_model_gpposterior/subsref.m0000644000000000000000000000335213156161544017030 0ustar % SUBSREF [overload base function] % Copyright Notice % % Copyright (C) 2015, 2016 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function value = subsref (M_post, idx) if strcmp (idx(1).type, '.') value = get (M_post, idx(1).subs); if length (idx) > 1, value = subsref (value, idx(2:end)); end else stk_error ('Illegal indexing.', 'IllegalIndexing'); end end % function %!shared M_post, n %! n = 15; %! x_obs = (linspace (0, pi, n))'; %! z_obs = sin (x_obs); %! %! M_prior = stk_model ('stk_materncov32_iso'); %! M_prior.param = log ([1.0; 2.1]); %! %! M_post = stk_model_gpposterior (M_prior, x_obs, z_obs); %!assert (isstruct (M_post.prior_model)); %!assert (isequal (size (M_post.input_data), [n 1])); %!assert (isequal (size (M_post.output_data), [n 1])); %!assert (isa (M_post.kreq, 'stk_kreq_qr')); %!error M_post(1); %!error M_post{1}; stk/inst/core/@stk_model_gpposterior/vertcat.m0000644000000000000000000000224113156161544017023 0ustar % VERTCAT [overload base function] % Copyright Notice % % Copyright (C) 2015 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function varargout = vertcat (varargin) stk_error (['Arrays of stk_model_gpposterior objects are not supported. ', ... 'Use cell arrays instead.'], 'IllegalOperation'); end % function stk/inst/core/@struct/0000755000000000000000000000000013156161544012104 5ustar stk/inst/core/@struct/get_input_data.m0000644000000000000000000000230413156161544015250 0ustar % GET_INTPUT_DATA returns the input data of the model % Copyright Notice % % Copyright (C) 2017 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function input_data = get_input_data (model) assert_struct_is_model (model); if isfield (model, 'dim') input_data = zeros (0, model.dim); else input_data = []; end end % function stk/inst/core/@struct/get_output_data.m0000644000000000000000000000216413156161544015455 0ustar % GET_OUTPUT_DATA returns the output data of the model % Copyright Notice % % Copyright (C) 2017 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function output_data = get_output_data (model) assert_struct_is_model (model); output_data = zeros (0, 1); end % function stk/inst/core/@struct/get_prior_model.m0000644000000000000000000000215213156161544015434 0ustar % GET_PRIOR_MODEL returns the prior_model structure % Copyright Notice % % Copyright (C) 2017 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function prior_model = get_prior_model (model) assert_struct_is_model (model); prior_model = model; end % function stk/inst/core/@struct/private/0000755000000000000000000000000013156161544013556 5ustar stk/inst/core/@struct/private/assert_struct_is_model.m0000644000000000000000000000233413156161544020516 0ustar % ASSERT_STRUCT_IS_MODEL [STK internal] % Copyright Notice % % Copyright (C) 2017 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function assert_struct_is_model (model) % Just a quick check if ~ isfield (model, 'param') stk_error (['The input argument does not look like a valid STK model' ... 'structure.'], 'Invalid Argument'); end end % function stk/inst/core/stk_cholcov.m0000644000000000000000000000472113156161544013160 0ustar % STK_CHOLCOV [STK internal] % % CALL: C = stk_cholcov (A, ...) % % returns the result of chol (A, ...) when this succeeds. If chol fails, % then a small amount of "regularization noise" is added to the diagonal % of A, in order to make chol succeed (see the code for details). % % NOTE: why this function ? % % This is a first (rough) attempt at solving numerical problems that % arise when chol is used with a covariance matrix that is semi-positive % definite, or positive definite with some very small eigenvalues. See % tickets #3, #4 and #13 on Sourceforge: % % https://sourceforge.net/p/kriging/tickets/3/ % https://sourceforge.net/p/kriging/tickets/4/ % https://sourceforge.net/p/kriging/tickets/13/ % % See also: chol % Copyright Notice % % Copyright (C) 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function C = stk_cholcov (A, varargin) % try to use a plain "chol" [C, p] = chol (A, varargin{:}); if p > 0, epsi = eps; u = diag (diag (A)); while p > 0, if epsi > 1, % avoids infinite while loops if ~ all (isfinite (A(:))) errmsg = 'A contains NaNs or Infs.'; else errmsg = 'A is not even close to positive definite'; end stk_error (errmsg, 'InvalidArgument'); end epsi = epsi * 10; [C, p] = chol (A + epsi * u); end warning ('STK:stk_cholcov:AddingRegularizationNoise', sprintf ... ('Adding a little bit of noise to help chol succeed (epsi = %.2e)', epsi)); end end % function %#ok<*SPWRN> stk/inst/core/stk_isnoisy.m0000644000000000000000000000404713156161544013221 0ustar % STK_ISNOISY returns false for noiseless models % % CALL: ISNOISY = stk_isnoisy (MODEL) % % returns false for a noiseless MODEL and true otherwise. % % MODEL is considered noiseless if: % % * MODEL.lognoisevariance is missing or empty (for backward compatibility % with previous versions of STK where the lognoisevariance field was % optional), % % * MODEL.lognoisevariance is equal to -inf (this is the default for a % model created by stk_model and the currently recommended way for % declaring a noiseless model), % % * MODEL.lognoisevariance is a vector of -inf (heteroscedastic case with % all variances set to zero). % % See also: stk_model % Copyright Notice % % Copyright (C) 2016 CentraleSupelec & LNE % % Authors: Julien Bect % Rémi Stroh % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function b = stk_isnoisy (model) if ~ isfield (model, 'lognoisevariance') % Backward compatiblity: accept model structures with missing % lognoisevariance (and consider them as noiseless models) b = false; else b = ~ ((isempty (model.lognoisevariance)) ... || (all (model.lognoisevariance == - inf))); end end % function stk/inst/core/stk_make_matcov.m0000644000000000000000000001054013156161544014005 0ustar % STK_MAKE_MATCOV computes a covariance matrix (and a design matrix) % % CALL: [K, P] = stk_make_matcov (MODEL, X0) % % computes the covariance matrix K and the design matrix P for the model % MODEL at the set of points X0, which is expected to be an N x DIM % array. As a result, a matrix K of size N x N and a matrix P of size % N x L are obtained, where L is the number of regression functions in % the linear part of the model. % % CALL: K = stk_make_matcov (MODEL, X0, X1) % % computes the covariance matrix K for the model MODEL between the sets % of points X0 and X1. The resulting K matrix is of size N0 x N1, where % N0 is the number of rows of XO and N1 the number of rows of X1. % % BE CAREFUL: % % stk_make_matcov (MODEL, X0) and stk_makematcov (MODEL, X0, X0) are NOT % equivalent if model.lognoisevariance > - inf (in the first case, the % noise variance is added on the diagonal of the covariance matrix). % Copyright Notice % % Copyright (C) 2015, 2016 CentraleSupelec % Copyright (C) 2011-2014 SUPELEC % % Authors: Julien Bect % Emmanuel Vazquez % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function [K, P] = stk_make_matcov (model, x0, x1, pairwise) % Check if the covariance model contains parameters % that should have been estimated first if (isnumeric (model.param)) && (any (isnan (model.param))) stk_error (['The covariance model contains undefined parameters, ' ... 'which must be estimated first.'], 'ParametersMustBeEstimated'); end %=== process input arguments if nargin > 4, stk_error ('Too many input arguments.', 'TooManyInputArgs'); end x0 = double (x0); if (nargin > 2) && (~ isempty (x1)), x1 = double (x1); make_matcov_auto = false; else x1 = x0; make_matcov_auto = true; end pairwise = (nargin > 3) && pairwise; %=== compute the covariance matrix K = feval (model.covariance_type, model.param, x0, x1, -1, pairwise); if make_matcov_auto && stk_isnoisy (model) K = K + stk_noisecov (size (K,1), model.lognoisevariance, -1, pairwise); end %=== compute the regression functions if nargout > 1, P = stk_ortho_func (model, x0); end end % function %!shared model, model2, x0, x1, n0, n1, d, Ka, Kb, Kc, Pa, Pb, Pc %! n0 = 20; n1 = 10; d = 4; %! model = stk_model ('stk_materncov52_aniso', d); %! model.lm = stk_lm_affine; %! model.param = log ([1.0; 2.1; 2.2; 2.3; 2.4]); %! model2 = model; model2.lognoisevariance = log(0.01); %! x0 = stk_sampling_randunif (n0, d); %! x1 = stk_sampling_randunif (n1, d); %!error [KK, PP] = stk_make_matcov (); %!error [KK, PP] = stk_make_matcov (model); %!test [Ka, Pa] = stk_make_matcov (model, x0); % (1) %!test [Kb, Pb] = stk_make_matcov (model, x0, x0); % (2) %!test [Kc, Pc] = stk_make_matcov (model, x0, x1); % (3) %!error [KK, PP] = stk_make_matcov (model, x0, x1, pi); %!assert (isequal (size (Ka), [n0 n0])); %!assert (isequal (size (Kb), [n0 n0])); %!assert (isequal (size (Kc), [n0 n1])); %!assert (isequal (size (Pa), [n0 d + 1])); %!assert (isequal (size (Pb), [n0 d + 1])); %!assert (isequal (size (Pc), [n0 d + 1])); % In the noiseless case, (1) and (2) should give the same results %!assert (isequal (Kb, Ka)); % In the noisy case, however... %!test [Ka, Pa] = stk_make_matcov (model2, x0); % (1') %!test [Kb, Pb] = stk_make_matcov (model2, x0, x0); % (2') %!error assert (isequal (Kb, Ka)); % The second output depends on x0 only => should be the same for (1)--(3) %!assert (isequal (Pa, Pb)); %!assert (isequal (Pa, Pc)); stk/inst/core/stk_model.m0000644000000000000000000001520513156161544012622 0ustar % STK_MODEL generates a model with default covariance parameters % % CALL: MODEL = stk_model () % % returns a structure MODEL (see below for a description of the fields in such % a structure) corresponding to one-dimensional Gaussian process prior with a % constant but unknown mean ("ordinary" kriging) and a stationary Matern % covariance function. % % CALL: MODEL = stk_model (COVARIANCE_TYPE) % % uses the user-supplied COVARIANCE_TYPE instead of the default. % % CALL: MODEL = stk_model (COVARIANCE_TYPE, DIM) % % creates a DIM-dimensional model. Note that, for DIM > 1, anisotropic % covariance functions are provided with default parameters that make them % isotropic. % % In STK, a Gaussian process model is described by a 'model' structure, % which has mandatory fields and optional fields. % % MANDATORY FIELDS: covariance_type, param, lm, lognoisevariance % OPTIONAL FIELD: param_prior, noise_prior % % See also stk_materncov_iso, stk_materncov_aniso, ... % Copyright Notice % % Copyright (C) 2015, 2016 CentraleSupelec % Copyright (C) 2011-2014 SUPELEC % % Authors: Julien Bect % Emmanuel Vazquez % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function model = stk_model (covariance_type, varargin) % Extract a handle and a name from what we are given if nargin > 0 if isa (covariance_type, 'function_handle') covariance_name = func2str (covariance_type); elseif ischar (covariance_type) covariance_name = covariance_type; covariance_type = str2func (covariance_type); else stk_error (['covariance_type should be a function name or a handle to ' ... 'a function.'], 'TypeMismatch'); end else covariance_type = @stk_materncov_iso; covariance_name = 'stk_materncov_iso'; end if strcmp (covariance_name, 'stk_discretecov') % special case: build a discrete model model = stk_model_discretecov (varargin{:}); else % general case model = stk_model_ (covariance_type, covariance_name, varargin{:}); end end % function %%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% stk_model_discretecov %%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%% function model_out = stk_model_discretecov (model_base, x) if nargin > 2, stk_error ('Too many input arguments.', 'TooManyInputArgs'); end % Make sure that lognoisevariance is -inf for noiseless models if ~ stk_isnoisy (model_base) model_base.lognoisevariance = -inf; end [K, P] = stk_make_matcov (model_base, x, x); model_out = struct ( ... 'covariance_type', 'stk_discretecov', ... 'param', struct ('K', K, 'P', P)); if ~ isscalar (model_base.lognoisevariance) error ('This case is not supported.'); else model_out.lognoisevariance = model_base.lognoisevariance; end end % function %%%%%%%%%%%%%%%%%% %%% stk_model_ %%% %%%%%%%%%%%%%%%%%% function model = stk_model_ (covariance_type, covariance_name, dim) if nargin > 3, stk_error ('Too many input arguments.', 'TooManyInputArgs'); end model = struct(); model.covariance_type = covariance_type; % use ordinary kriging as a default choice model.lm = stk_lm_constant (); % default dimension is d = 1 if nargin < 3, model.dim = 1; else model.dim = dim; end % For known covariance types, the field param is initialized with a vector of % nan of the appropriate size. This serves as a reminder, for the user, of the % correct size for a parameter vector---nothing more. switch covariance_name case 'stk_materncov_iso' model.param = nan (3, 1); case {'stk_expcov_iso', 'stk_materncov32_iso', 'stk_materncov52_iso', ... 'stk_gausscov_iso', 'stk_sphcov_iso'} model.param = nan (2, 1); case 'stk_materncov_aniso' model.param = nan (2 + model.dim, 1); case {'stk_expcov_aniso', 'stk_materncov32_aniso', ... 'stk_materncov52_aniso', 'stk_gausscov_aniso', 'stk_sphcov_aniso'} model.param = nan (1 + model.dim, 1); otherwise model.param = []; end % switch model.lognoisevariance = - inf; end % function %!test model = stk_model(); %!test model = stk_model('stk_expcov_iso'); %!test model = stk_model('stk_expcov_iso', 1); %!test model = stk_model('stk_expcov_iso', 3); %!test model = stk_model('stk_expcov_aniso'); %!test model = stk_model('stk_expcov_aniso', 1); %!test model = stk_model('stk_expcov_aniso', 3); %!test model = stk_model('stk_materncov_iso'); %!test model = stk_model('stk_materncov_iso', 1); %!test model = stk_model('stk_materncov_iso', 3); %!test model = stk_model('stk_materncov_aniso'); %!test model = stk_model('stk_materncov_aniso', 1); %!test model = stk_model('stk_materncov_aniso', 3); %!test model = stk_model('stk_materncov32_iso'); %!test model = stk_model('stk_materncov32_iso', 1); %!test model = stk_model('stk_materncov32_iso', 3); %!test model = stk_model('stk_materncov32_aniso'); %!test model = stk_model('stk_materncov32_aniso', 1); %!test model = stk_model('stk_materncov32_aniso', 3); %!test model = stk_model('stk_materncov52_iso'); %!test model = stk_model('stk_materncov52_iso', 1); %!test model = stk_model('stk_materncov52_iso', 3); %!test model = stk_model('stk_materncov52_aniso'); %!test model = stk_model('stk_materncov52_aniso', 1); %!test model = stk_model('stk_materncov52_aniso', 3); %!test model = stk_model('stk_gausscov_iso'); %!test model = stk_model('stk_gausscov_iso', 1); %!test model = stk_model('stk_gausscov_iso', 3); %!test model = stk_model('stk_gausscov_aniso'); %!test model = stk_model('stk_gausscov_aniso', 1); %!test model = stk_model('stk_gausscov_aniso', 3); %!test model = stk_model('stk_sphcov_iso'); %!test model = stk_model('stk_sphcov_iso', 1); %!test model = stk_model('stk_sphcov_iso', 3); %!test model = stk_model('stk_sphcov_aniso'); %!test model = stk_model('stk_sphcov_aniso', 1); %!test model = stk_model('stk_sphcov_aniso', 3); stk/inst/core/stk_model_fixlm.m0000644000000000000000000000551713156161544014026 0ustar % STK_MODEL_FIXLM [STK internal] % % This internal STK function ensures backward compatiblity for model structures % with a .order field. % Copyright Notice % % Copyright (C) 2016 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function model = stk_model_fixlm (model) if isfield (model, 'lm') % Modern style: .lm field if isfield (model, 'order') % If model.order is also present, it should be NaN if ~ isnan (model.order) % We also tolerate the case where model.order is compatible with % model.lm (i.e., model.lm is a polynomial trend object, with the % appropriate degree. if ((model.order == -1) && (isa (model.lm, 'stk_lm_null'))) ... || ((model.order == 0) && (isa (model.lm, 'stk_lm_constant'))) ... || ((model.order == 1) && (isa (model.lm, 'stk_lm_affine'))) ... || ((model.order == 2) && (isa (model.lm, 'stk_lm_quadratic'))) ... || ((model.order == 3) && (isa (model.lm, 'stk_lm_cubic'))) model.order = nan; else stk_error (sprintf (['Invalid model structure: both ' ... 'model.lm and model.order are present, and their ' ... 'values are not compatible.\nThe ''.order'' field ' ... 'is deprecated, please consider using ''.lm'' only.']), ... 'InvalidArgument'); end end % if ~ isnan (model.order) model = rmfield (model, 'order'); end % if isfield (model.order) elseif isfield (model, 'order') % Old style: .order field only model.lm = stk_lm_polynomial (model.order); model = rmfield (model, 'order'); else % Assume constant mean when neither .order nor .lm is present model.lm = stk_lm_constant (); end end % function stk/inst/core/stk_model_update.m0000644000000000000000000000356613156161544014173 0ustar % STK_MODEL_UPDATE updates a model with new data % % CALL: M_POSTERIOR = stk_model_update (M_PRIOR, X, Y) % % updates model M_PRIOR with additional data (X, Y). The result is an % stk_model_gpposterior object. % % See also: stk_model_gpposterior % Copyright Notice % % Copyright (C) 2016 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function M_posterior = stk_model_update (M_prior, xi, zi) M_posterior = stk_model_gpposterior (M_prior, xi, zi); end % function %!test %! x1 = (linspace (0, 1, 15))'; z1 = sin (x1); %! x2 = (linspace (2, 3, 15))'; z2 = sin (x2); %! xt = (linspace (1, 2, 15))'; zt = sin (xt); %! %! % Prior model %! M0 = stk_model ('stk_materncov32_iso'); %! M0.param = log ([1.0; 2.1]); %! %! M1 = stk_model_update (M0, x1, z1); %! M1 = stk_model_update (M1, x2, z2); % this calls @stk_model_gpposterior/... %! zp1 = stk_predict (M1, xt); %! %! M2 = stk_model_gpposterior (M0, [x1; x2], [z1; z2]); %! zp2 = stk_predict (M2, xt); %! %! assert (stk_isequal_tolabs (double (zp2 - zp1), zeros (15, 2), 1e-10)) stk/inst/core/stk_ortho_func.m0000644000000000000000000000672113156161544013673 0ustar % STK_ORTHO_FUNC [deprecated] % % CALL: P = stk_ortho_func (MODEL, X) % % computes the design matrix for the linear part of model MODEL at the set of % evaluation points X. In general (see special case below), X is expected to % be a structure, whose field 'a' contains the actual numerical data as an N % x DIM matrix, where N is the number of evaluation points and and DIM the % dimension of the space of factors. A matrix P of size N x L is returned, % where L is the number of regression functions in the linear part of the % model; e.g., L = 1 if MODEL.order is zero (ordinary kriging). % % DEPRECATION WARNINGS: % % The use of a .order field in model structures is deprecated and will be % removed in a future release of STK. The recommended approach is now to use % a .lm field, which contains a function handle or any object that behaves % like one (see stk_lm_*). % % stk_orth_func is deprecated and will be removed from future versions of % STK (http://sourceforge.net/p/kriging/tickets/12). % % See also stk_make_matcov % Copyright Notice % % Copyright (C) 2016 CentraleSupelec % Copyright (C) 2011-2014 SUPELEC % % Authors: Julien Bect % Emmanuel Vazquez % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function P = stk_ortho_func (model, x) if nargin > 2, stk_error ('Too many input arguments.', 'TooManyInputArgs'); end x = double (x); if strcmp (model.covariance_type, 'stk_discretecov') P = model.param.P(x, :); else % General case % Ensure backward compatiblity model = stk_model_fixlm (model); P = feval (model.lm, x); end end % function %!shared model, x, n, d %! n = 15; d = 4; %! model = stk_model ('stk_materncov_aniso', d); %! x = stk_sampling_randunif (n, d); %! model = rmfield (model, 'lm'); % Test the old .order approach %!error P = stk_ortho_func (); %!error P = stk_ortho_func (model); %!test P = stk_ortho_func (model, x); %!error P = stk_ortho_func (model, x, pi); %!test %! model.order = -1; P = stk_ortho_func (model, x); %! assert (isequal (size (P), [n, 0])); %!test %! model.order = 0; P = stk_ortho_func (model, x); %! assert (isequal (size (P), [n, 1])); %!test %! model.order = 1; P = stk_ortho_func (model, x); %! assert (isequal (size (P), [n, d + 1])); %!test %! model.order = 2; P = stk_ortho_func (model, x); %! assert (isequal (size (P), [n, 1 + d * (d + 3) / 2])); %!test %! model.order = 3; P = stk_ortho_func (model, x); %! assert (isequal (size (P), [n, 1 + d * (11 + d * (6 + d)) / 6])); %!error %! model.order = 4; P = stk_ortho_func (model, x); %! % model.order > 3 is not allowed stk/inst/core/stk_predict.m0000644000000000000000000001201013156161544013143 0ustar % STK_PREDICT performs a kriging prediction from data % % CALL: ZP = stk_predict (MODEL, XI, ZI, XP) % % performs a kriging prediction at the points XP, given the observations % (XI, ZI) and the prior MODEL. The input arguments XI, ZI, and XP can be % either numerical matrices or dataframes. More precisely, on a factor space % of dimension DIM, % % * XI must have size NI x DIM, % * ZI must have size NI x 1, % * XP must have size NP x DIM, % % where NI is the number of observations and NP the number of prediction % points. The output ZP is a dataframe of size NP x 2, with: % % * the kriging predictor in the first column (ZP.mean), and % * the kriging variance in the second column (ZP.var). % % From a Bayesian point of view, ZP.mean and ZP.var are respectively the % posterior mean and variance of the Gaussian process prior MODEL given the % data (XI, ZI). Note that, in the case of noisy data, ZP.var is the % (posterior) variance of the latent Gaussian process, not the variance of a % future noisy observation at location XP. % % CALL: [ZP, LAMBDA, MU] = stk_predict (MODEL, XI, ZI, XP) % % also returns the matrix of kriging weights LAMBDA and the matrix of % Lagrange multipliers MU. % % CALL: [ZP, LAMBDA, MU, K] = stk_predict (MODEL, XI, ZI, XP) % % also returns the posterior covariance matrix K at the locations XP (this is % an NP x NP covariance matrix). From a frequentist point of view, K can be % seen as the covariance matrix of the prediction errors. % % SPECIAL CASE % % If ZI is empty, everything but ZP.mean is computed. Indeed, neither the % kriging variance ZP.var nor the matrices LAMBDA and MU actually depend on % the observed values. % Copyright Notice % % Copyright (C) 2015, 2016 CentraleSupelec % Copyright (C) 2011-2014 SUPELEC % % Authors: Julien Bect % Emmanuel Vazquez % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function varargout = stk_predict (M_prior, x_obs, z_obs, x_prd) if nargin > 4, stk_error ('Too many input arguments.', 'TooManyInputArgs'); end M_post = stk_model_gpposterior (M_prior, x_obs, z_obs); varargout = cell (1, max (1, nargout)); [varargout{:}] = stk_predict (M_post, x_prd); end % function %!shared n, m, model, x0, x_obs, z_obs, x_prd, y_prd1, idx_obs, idx_prd %! %! n = 10; % number of observations %! m = n + 1; % number of predictions %! d = 1; % dimension of the input space %! %! x0 = stk_sampling_regulargrid(n+m, d, [0; pi]); %! %! idx_obs = (2:2:(n+m-1))'; %! idx_prd = (1:2:(n+m))'; %! %! x_obs = x0(idx_obs); %! z_obs = sin (double (x_obs)); %! x_prd = x0(idx_prd); %! %! model = stk_model('stk_materncov32_iso'); %! model.param = log ([1.0; 2.1]); %!error y_prd1 = stk_predict(); %!error y_prd1 = stk_predict(model); %!error y_prd1 = stk_predict(model, x_obs); %!error y_prd1 = stk_predict(model, x_obs, z_obs); %!test y_prd1 = stk_predict(model, x_obs, z_obs, x_prd); %!error y_prd1 = stk_predict(model, x_obs, z_obs, x_prd, 0); %!test % nargout = 2 %! [y_prd1, lambda] = stk_predict (model, x_obs, z_obs, x_prd); %! assert (isequal (size (lambda), [n m])); %!test % nargout = 2, compute only variances %! [y_prd1, lambda] = stk_predict (model, x_obs, [], x_prd); %! assert (isequal (size (lambda), [n m])); %! assert (all (isnan (y_prd1.mean))); %!test % nargout = 3 %! [y_prd1, lambda, mu] = stk_predict (model, x_obs, z_obs, x_prd); %! assert (isequal (size (lambda), [n m])); %! assert (isequal (size (mu), [1 m])); % ordinary kriging %!test % nargout = 4 %! [y_prd1, lambda, mu, K] = stk_predict (model, x_obs, z_obs, x_prd); %! assert (isequal (size (lambda), [n m])); %! assert (isequal (size (mu), [1 m])); % ordinary kriging %! assert (isequal (size (K), [m m])); %!test % predict on large set of locations %! x_prd = stk_sampling_regulargrid (1e5, 1, [0; pi]); %! y_prd = stk_predict (model, x_obs, z_obs, x_prd); %!test % predict on an observation point %! % https://sourceforge.net/p/kriging/tickets/49/ %! [zp, lambda] = stk_predict (model, x_obs, z_obs, x_obs(4)); %! assert (isequal (z_obs(4), zp.mean)) %! assert (isequal (zp.var, 0)) %! lambda_ref = zeros (n, 1); lambda_ref(4) = 1; %! assert (isequal (lambda, lambda_ref)) stk/inst/core/stk_predict_leaveoneout.m0000644000000000000000000001006613156161544015562 0ustar % STK_PREDICT_LEAVEONEOUT computes LOO predictions and residuals % % CALL: LOO_PRED = stk_predict_leaveoneout (M_PRIOR, XI, ZI) % % computes LOO predictions for (XI, ZI) using the prior model M_PRIOR. The % result is a dataframe with n rows and two columns, where n is the common % number of rows of XI and ZI. The first column is named 'mean' and contains % LOO prediction means. The second column is named 'var' and contains LOO % prediction variances. % % CALL: [LOO_PRED, LOO_RES] = stk_predict_leaveoneout (M_PRIOR, XI, ZI) % % also returns LOO residuals. The result LOO_RES is a dataframe with n rows % and two columns. The first column is named 'residuals' and contains raw % (i.e., unnormalized) residuals. The second column is named 'norm_res' and % contains normalized residuals. % % CALL: [LOO_PRED, LOO_RES] = stk_predict_leaveoneout (M_POST) % % does the same as above using a posterior model object M_POST directly. % % CALL: stk_predict_leaveoneout (...) % % automatically produces LOO cross-validations plots in the current figure, % using stk_plot_predvsobs (left panel) and stk_plot_histnormres (right % panel). % % REMARK % % This function actually computes pseudo-LOO prediction and residuals, % where the same parameter vector is used for all data points. % % See also stk_example_kb10, stk_plot_predvsobs, stk_plot_histnormres % Copyright Notice % % Copyright (C) 2016, 2017 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function varargout = stk_predict_leaveoneout (M_prior, xi, zi) if nargin > 3 stk_error ('Too many input arguments.', 'TooManyInputArgs'); end M_post = stk_model_gpposterior (M_prior, xi, zi); if nargout == 0 % Call stk_predict_leaveoneout with nargout == 0 to create the plots stk_predict_leaveoneout (M_post); else varargout = cell (1, nargout); [varargout{:}] = stk_predict_leaveoneout (M_post); end end % function %!shared n, x_obs, z_obs, model %! n = 20; %! x_obs = stk_sampling_regulargrid (n, 1, [0; 2*pi]); %! z_obs = stk_feval (@sin, x_obs); %! model = stk_model ('stk_materncov32_iso'); %! model.param = log ([1; 5]); %!test % one output %! %! loo_pred = stk_predict_leaveoneout (model, x_obs, z_obs); %! %! assert (isequal (size (loo_pred), [n 2])); %! assert (isequal (loo_pred.colnames, {'mean', 'var'})); %! assert (all (isfinite (loo_pred(:)))); %!test % two outputs %! %! [loo_pred, loo_res] = stk_predict_leaveoneout (model, x_obs, z_obs); %! %! assert (isequal (size (loo_pred), [n 2])); %! assert (isequal (loo_pred.colnames, {'mean', 'var'})); %! assert (all (isfinite (loo_pred(:)))); %! %! assert (isequal (size (loo_res), [n 2])); %! assert (isequal (loo_res.colnames, {'residuals', 'norm_res'})); %! assert (all (isfinite (loo_res(:)))); %!test % heteroscedastic noise case %! %! model.lognoisevariance = (1 + rand (n, 1)) * 1e-6; %! [loo_pred, loo_res] = stk_predict_leaveoneout (model, x_obs, z_obs); %! %! assert (isequal (size (loo_pred), [n 2])); %! assert (isequal (loo_pred.colnames, {'mean', 'var'})); %! assert (all (isfinite (loo_pred(:)))); %! %! assert (isequal (size (loo_res), [n 2])); %! assert (isequal (loo_res.colnames, {'residuals', 'norm_res'})); %! assert (all (isfinite (loo_res(:)))); stk/inst/covfcs/0000755000000000000000000000000013156161544011013 5ustar stk/inst/covfcs/rbf/0000755000000000000000000000000013156161544011564 5ustar stk/inst/covfcs/rbf/stk_rbf_exponential.m0000644000000000000000000000711513156161544016006 0ustar % STK_RBF_EXPONENTIAL computes the exponential correlation function % % CALL: K = stk_rbf_exponential (H) % % computes the value of the exponential correlation function at distance H: % % K = exp (- sqrt(2) |H|). % % Note that this correlation function is a special of the Matern correlation % function (NU = 1/2). % % CALL: K = stk_rbf_exponential (H, DIFF) % % computes the derivative of the exponential correlation function with % respect the H if DIFF is equal to 1, and simply returns the value of the % exponential correlation function if DIFF <= 0 (in which case it is % equivalent to K = stk_rbf_exponential (H)). % % ADMISSIBILITY % % The exponential correlation is a valid correlation function for all % dimensions. % % REMARK % % The constant sqrt (2) is consistent with the definition of the Matern % correlation function in STK. Other references may use different constants. % % See also: stk_rbf_matern, stk_rbf_matern32, stk_rbf_matern52 % Copyright Notice % % Copyright (C) 2016 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function k = stk_rbf_exponential (h, diff) if nargin > 2, stk_error ('Too many input arguments.', 'TooManyInputArgs'); end C = 1.4142135623730951; % 2 * sqrt (Nu) with Nu = 1/2 % value of the exponential correlation at h k = exp (- C * abs (h)); % for diff <= 0, we return the value of the correlation function; otherwise... if (nargin > 1) && (diff > 0) % for diff == 1, we return the derivative if diff == 1 b = (k > 0); % convention: k'(0) = 0, even though k is not derivable at h=0 k(b) = - C * (sign (h(b))) .* k(b); else error ('incorrect value for diff.'); end end if any (isnan (k)) keyboard end end % function %!shared h, diff %! h = 1.0; diff = -1; %!error stk_rbf_exponential (); %!test stk_rbf_exponential (h); %!test stk_rbf_exponential (h, diff); %!error stk_rbf_exponential (h, diff, pi); %!test %% h = 0.0 => correlation = 1.0 %! x = stk_rbf_exponential (0.0); %! assert (stk_isequal_tolrel (x, 1.0, 1e-8)); %!test %% check derivative numerically %! h = [-1 -0.5 -0.1 0.1 0.5 1]; delta = 1e-9; %! d1 = (stk_rbf_exponential (h + delta) - stk_rbf_exponential (h)) / delta; %! d2 = stk_rbf_exponential (h, 1); %! assert (stk_isequal_tolabs (d1, d2, 1e-4)); %!test %% consistency with stk_rbf_matern: function values %! for h = 0.1:0.1:2.0, %! x = stk_rbf_matern (1/2, h); %! y = stk_rbf_exponential (h); %! assert (stk_isequal_tolrel (x, y, 1e-8)); %! end %!test %% consistency with stk_rbf_matern: derivatives %! for h = 0.1:0.1:2.0, %! x = stk_rbf_matern (1/2, h, 2); %! y = stk_rbf_exponential (h, 1); %! assert (stk_isequal_tolrel (x, y, 1e-8)); %! end %!assert (stk_rbf_exponential (inf) == 0) stk/inst/covfcs/rbf/stk_rbf_gauss.m0000644000000000000000000000503713156161544014603 0ustar % STK_RBF_GAUSS computes the Gaussian correlation function % % CALL: K = stk_rbf_gauss (H) % % computes the value of the Gaussian correlation function at distance H. % % CALL: K = stk_rbf_gauss (H, DIFF) % % computes the derivative of the Gaussian correlation function with respect % to the distance H if DIFF is equal to 1. If DIFF is equal to -1, this is % the same as K = stk_rbf_gauss (H). % % NOTES: % % * This correlation function is also known as the "squared exponential" corre- % lation function, or the "Gaussian RBF" (Radial Basis Function). % % * The Gaussian correlation function is a valid correlation function for all % dimensions. % % * The Gaussian correlation function is the limit of the Matern correlation % function when the regularity parameters tends to infinity. % % See also: stk_rbf_matern, stk_rbf_matern52 % Copyright Notice % % Copyright (C) 2016 CentraleSupelec % Copyright (C) 2013 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function k = stk_rbf_gauss (h, diff) if nargin > 2, stk_error ('Too many input arguments.', 'TooManyInputArgs'); end % default: compute the value (not a derivative) if nargin < 2, diff = -1; end if diff <= 0, % value of the covariance function k = exp (- h .^ 2); elseif diff == 1, % derivative wrt h k = - 2 * h .* exp (- h .^ 2); else error ('incorrect value for diff.'); end end % function %!shared h, diff %! h = 1.0; diff = -1; %!error stk_rbf_gauss (); %!test stk_rbf_gauss (h); %!test stk_rbf_gauss (h, diff); %!error stk_rbf_gauss (h, diff, pi); %!test % h = 0.0 => correlation = 1.0 %! x = stk_rbf_gauss (0.0); %! assert (stk_isequal_tolrel (x, 1.0, 1e-8)); stk/inst/covfcs/rbf/stk_rbf_matern.m0000644000000000000000000001127313156161544014746 0ustar % STK_RBF_MATERN computes the Matern correlation function. % % CALL: K = stk_rbf_matern (NU, H) % % computes the value of the Matern correlation function of order NU at % distance H. Note that the Matern correlation function is a valid % correlation function for all dimensions. % % CALL: K = stk_rbf_matern (NU, H, DIFF) % % computes the derivative of the Matern correlation function of order NU, at % distance H, with respect to the order NU if DIFF is equal to 1, or with % respect the distance H if DIFF is equal to 2. (If DIFF is equal to -1, % this is the same as K = stk_rbf_matern(NU, H).) % % See also: stk_rbf_matern32, stk_rbf_matern52 % Copyright Notice % % Copyright (C) 2016 CentraleSupelec % Copyright (C) 2011-2014 SUPELEC % % Authors: Julien Bect % Emmanuel Vazquez % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function k = stk_rbf_matern (nu, h, diff) if nargin > 3, stk_error ('Too many input arguments.', 'TooManyInputArgs'); end % default: compute the value (not a derivative) if nargin < 3, diff = -1; end if ~ ((isscalar (nu)) && (nu > 0)) stk_error ('nu should be a positive scalar.', 'IncorrectSize'); end % Handle the case of VERY large nu if nu > 1e305, % nu = 1e306 is so large thatn even gammaln (nu) is not defined ! if diff <= 0, k = stk_rbf_gauss (h); return; else % Cannot compute or approximate the derivative for such a large nu k = nan (size (h)); return; end end % Tolerance for the detection of half-integer values of nu TOL = 10 * eps; % We have no analytical expression for the derivative with respect to nu, % even if nu is 3/2, 5/2 or +Inf if diff ~= 1, if abs (nu - 1.5) < TOL, k = stk_rbf_matern32 (h, diff - 1); return; elseif abs (nu - 2.5) < TOL, k = stk_rbf_matern52 (h, diff - 1); return; end end [N, M] = size (h); hp = abs (reshape (h, N * M, 1)); t = 2 * sqrt (nu) * hp; z = 0.5 * exp (gammaln (nu) - nu * log (0.5 * t)); I = ~ isinf (z); if diff <= 0 k = zeros (N * M, 1); % When z < +Inf, compute using the modified Bessel function of the second kind k(I) = 1 ./ z(I) .* besselk_ (nu, t(I)); % When z == +Inf, it means nu is large and/or t is close to zero. % We approximate the result with the upper bound provided by the Gaussian case. k(~I) = stk_rbf_gauss (h(~I)); elseif diff == 1 % numerical derivative wrt Nu itermax = 2; delta = 1e-4; dk = zeros (N * M, itermax); for l= 1:itermax Nu_p = nu + 2 ^ (l - 1) * delta; Nu_m = nu - 2 ^ (l - 1) * delta; t_p = 2 * sqrt (Nu_p) * hp; t_m = 2 * sqrt (Nu_m) * hp; k_p = 1 / (2 ^ (Nu_p - 1) * gamma (Nu_p)) .* t_p(I) .^ Nu_p .* ... besselk_ (Nu_p, t_p(I)); k_m = 1 / (2 ^ (Nu_m - 1) * gamma (Nu_m)) .* t_m(I) .^ Nu_m .* ... besselk_ (Nu_m, t_m(I)); dk(I, l) = k_p - k_m; end k = 1 / (12 * delta)* (- dk(:, 2) + 8 * dk(:, 1)); elseif diff == 2 % deriv. wrt h k = zeros (N * M, 1); dtdh = 2 * sqrt (nu); k(I) = - dtdh ./ z(I) .* besselk_ (nu - 1, t(I)); end k = reshape (k, N, M); end % function function y = besselk_ (nu, x) opts = stk_options_get('stk_rbf_matern'); if size(x, 1) < opts.min_size_for_parallelization, y = besselk(nu, x); else y = stk_parallel_feval(@(t)(besselk(nu, t)), x, true, opts.min_block_size); end end % function %!shared nu, h, diff %! nu = 1.0; h = 1.0; diff = -1; %!error stk_rbf_matern (); %!error stk_rbf_matern (nu); %!test stk_rbf_matern (nu, h); %!test stk_rbf_matern (nu, h, diff); %!error stk_rbf_matern (nu, h, diff, pi); %!test %% h = 0.0 => correlation = 1.0 %! for nu = 0.1:0.2:5.0, %! x = stk_rbf_matern (nu, 0.0); %! assert (stk_isequal_tolrel (x, 1.0, 1e-8)); %! end stk/inst/covfcs/rbf/stk_rbf_matern32.m0000644000000000000000000000564713156161544015123 0ustar % STK_RBF_MATERN32 computes the Matern correlation function of order 3/2. % % CALL: K = stk_rbf_matern32 (H) % % computes the value of the Matern correlation function of order 3/2 at % distance H. Note that the Matern correlation function is a valid % correlation function for all dimensions. % % CALL: K = stk_rbf_matern32 (H, DIFF) % % computes the derivative of the Matern correlation function of order 3/2, at % distance H, with respect the distance H if DIFF is equal to 1. (If DIFF is % equal to -1, this is the same as K = stk_rbf_matern32(H).) % % See also: stk_rbf_matern, stk_rbf_matern52 % Copyright Notice % % Copyright (C) 2016 CentraleSupelec % Copyright (C) 2011, 2012 SUPELEC % % Authors: Julien Bect % Emmanuel Vazquez % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function k = stk_rbf_matern32 (h, diff) if nargin > 2, stk_error ('Too many input arguments.', 'TooManyInputArgs'); end % default: compute the value (not a derivative) if nargin < 2, diff = -1; end Nu = 3/2; C = 2 * sqrt (Nu); % dt/dh t = C * abs (h); k = exp (- t); b = (k > 0); if diff <= 0, % value of the covariance function k(b) = (1 + t(b)) .* k(b); elseif diff == 1, % derivative wrt h k(b) = - C * t(b) .* k(b); else error ('incorrect value for diff.'); end end % function %!shared h, diff %! h = 1.0; diff = -1; %!error stk_rbf_matern32 (); %!test stk_rbf_matern32 (h); %!test stk_rbf_matern32 (h, diff); %!error stk_rbf_matern32 (h, diff, pi); %!test %% h = 0.0 => correlation = 1.0 %! x = stk_rbf_matern32 (0.0); %! assert (stk_isequal_tolrel (x, 1.0, 1e-8)); %!test %% consistency with stk_rbf_matern: function values %! for h = 0.1:0.1:2.0, %! x = stk_rbf_matern (3/2, h); %! y = stk_rbf_matern32 (h); %! assert (stk_isequal_tolrel (x, y, 1e-8)); %! end %!test %% consistency with stk_rbf_matern: derivatives %! for h = 0.1:0.1:2.0, %! x = stk_rbf_matern (3/2, h, 2); %! y = stk_rbf_matern32 (h, 1); %! assert (stk_isequal_tolrel (x, y, 1e-8)); %! end %!assert (stk_rbf_matern32 (inf) == 0) stk/inst/covfcs/rbf/stk_rbf_matern52.m0000644000000000000000000000567613156161544015127 0ustar % STK_RBF_MATERN52 computes the Matern correlation function of order 5/2. % % CALL: K = stk_rbf_matern52 (H) % % computes the value of the Matern correlation function of order 5/2 at % distance H. Note that the Matern correlation function is a valid % correlation function for all dimensions. % % CALL: K = stk_rbf_matern52 (H, DIFF) % % computes the derivative of the Matern correlation function of order 5/2, at % distance H, with respect the distance H if DIFF is equal to 1. (If DIFF is % equal to -1, this is the same as K = stk_rbf_matern52(H).) % % See also: stk_rbf_matern, stk_rbf_matern32 % Copyright Notice % % Copyright (C) 2016 CentraleSupelec % Copyright (C) 2011, 2012 SUPELEC % % Authors: Julien Bect % Emmanuel Vazquez % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function k = stk_rbf_matern52 (h, diff) if nargin > 2, stk_error ('Too many input arguments.', 'TooManyInputArgs'); end % default: compute the value (not a derivative) if nargin < 2, diff = -1; end Nu = 5/2; C = 2 * sqrt (Nu); % dt/dh t = C * abs (h); k = exp (- t); b = (k > 0); t = t(b); if diff <= 0, % value of the covariance function k(b) = (1 + t + t.^2/3) .* k(b); elseif diff == 1, % derivative wrt h k(b) = C * -t/3 .* (1 + t) .* k(b); else error ('incorrect value for diff.'); end end % function %!shared h, diff %! h = 1.0; diff = -1; %!error stk_rbf_matern52 (); %!test stk_rbf_matern52 (h); %!test stk_rbf_matern52 (h, diff); %!error stk_rbf_matern52 (h, diff, pi); %!test %% h = 0.0 => correlation = 1.0 %! x = stk_rbf_matern52 (0.0); %! assert (stk_isequal_tolrel (x, 1.0, 1e-8)); %!test %% consistency with stk_rbf_matern: function values %! for h = 0.1:0.1:2.0, %! x = stk_rbf_matern (5/2, h); %! y = stk_rbf_matern52 (h); %! assert (stk_isequal_tolrel (x, y, 1e-8)); %! end %!test %% consistency with stk_rbf_matern: derivatives %! for h = 0.1:0.1:2.0, %! x = stk_rbf_matern (5/2, h, 2); %! y = stk_rbf_matern52 (h, 1); %! assert (stk_isequal_tolrel (x, y, 1e-8)); %! end %!assert (stk_rbf_matern52 (inf) == 0) stk/inst/covfcs/rbf/stk_rbf_spherical.m0000644000000000000000000000551513156161544015434 0ustar % STK_RBF_SPHERICAL computes the spherical correlation function % % CALL: K = stk_rbf_spherical (H) % % computes the value of the spherical correlation function at distance H: % % / % | 1 - 3/2 |h| + 1/2 |h|^3 if |h| < 1, % K = | % | 0 otherwise. % \ % % CALL: K = stk_rbf_spherical (H, DIFF) % % computes the derivative of the spherical correlation function with % respect the H if DIFF is equal to 1, and simply returns the value of the % exponential correlation function if DIFF <= 0 (in which case it is % equivalent to K = stk_rbf_spherical (H)). % % ADMISSIBILITY % % The spherical correlation is a valid correlation function in % dimension d <= 3. % Copyright Notice % % Copyright (C) 2016 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function k = stk_rbf_spherical (h, diff) if nargin > 2, stk_error ('Too many input arguments.', 'TooManyInputArgs'); end t = abs (h); b = (t < 1); k = zeros (size (h)); if (nargin < 2) || (diff <= 0) % value of the spherical correlation at h k(b) = ((1 - t(b)) .^ 2) .* (1 + 0.5 * t(b)); elseif diff == 1 % derivative of the spherical correlation function at h % (convention: k'(0) = 0, even though k is not derivable at h=0) k(b) = 1.5 * (sign (h(b))) .* (t(b) .^ 2 - 1); else error ('incorrect value for diff.'); end end % function %!shared h, diff %! h = 1.0; diff = -1; %!error stk_rbf_spherical (); %!test stk_rbf_spherical (h); %!test stk_rbf_spherical (h, diff); %!error stk_rbf_spherical (h, diff, pi); %!test %% h = 0.0 => correlation = 1.0 %! x = stk_rbf_spherical (0.0); %! assert (stk_isequal_tolrel (x, 1.0, 1e-8)); %!test %% check derivative numerically %! h = [-1 -0.5 -0.1 0.1 0.5 1]; delta = 1e-9; %! d1 = (stk_rbf_spherical (h + delta) - stk_rbf_spherical (h)) / delta; %! d2 = stk_rbf_spherical (h, 1); %! assert (stk_isequal_tolabs (d1, d2, 1e-4)); %!assert (stk_rbf_spherical (inf) == 0) stk/inst/covfcs/rbf/stk_sf_gausscorr.m0000644000000000000000000000215613156161544015327 0ustar % STK_SF_GAUSSCORR is deprecated, use stk_rbf_gauss instead % % See also: stk_rbf_gauss % Copyright Notice % % Copyright (C) 2016 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function k = stk_sf_gausscorr (h, diff) k = stk_rbf_gauss (h, diff); end % function stk/inst/covfcs/rbf/stk_sf_matern.m0000644000000000000000000000215713156161544014606 0ustar % STK_SF_MATERN is deprecated, use stk_rbf_matern instead % % See also: stk_rbf_matern % Copyright Notice % % Copyright (C) 2016 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function k = stk_sf_matern (nu, h, diff) k = stk_rbf_matern (h, diff); end % function stk/inst/covfcs/rbf/stk_sf_matern32.m0000644000000000000000000000216513156161544014752 0ustar % STK_SF_MATERN32 is deprecated, use stk_rbf_matern32 instead % % See also: stk_rbf_matern32 % Copyright Notice % % Copyright (C) 2016 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function k = stk_sf_matern32 (h, diff) k = stk_rbf_matern32 (h, diff); end % function stk/inst/covfcs/rbf/stk_sf_matern52.m0000644000000000000000000000216513156161544014754 0ustar % STK_SF_MATERN52 is deprecated, use stk_rbf_matern52 instead % % See also: stk_rbf_matern52 % Copyright Notice % % Copyright (C) 2016 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function k = stk_sf_matern52 (h, diff) k = stk_rbf_matern52 (h, diff); end % function stk/inst/covfcs/stk_discretecov.m0000644000000000000000000000727713156161544014401 0ustar % STK_DISCRETECOV computes a covariance matrix for a discrete model % % CALL: K = stk_discretecov (PARAM, X, Y) % % computes the covariance matrix K between the sets of locations X and % Y, using the discrete model (a kriging model on a discrete space) % parameters PARAM. The inputs arguments X and Y are expected to be % vectors of indices. The output matrix K has size NX x NY, where NX is % the length of X and NY the length of Y. PARAM must contain a field % PARAM.K which is the full covariance matrix on the discrete input % space. % % CALL: K = stk_discretecov (PARAM, X, Y, DIFF, PAIRWISE) % % computes the covariance *vector* between the sets of locations X and % Y if PAIRWISE is TRUE, and the covariance *matrix* otherwise. In the % first case, the output K is a vector of length N, where N is the % common number of rows of X and Y. In the second, it is an NX x NY % matrix as above. The argument DIFF has no effect, but must be equal % to -1 since this is not a parametric model. % Copyright Notice % % Copyright (C) 2015, 2016 CentraleSupelec % Copyright (C) 2013, 2014 SUPELEC % % Authors: Julien Bect % Emmanuel Vazquez % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function K = stk_discretecov (param, x, y, diff, pairwise) %--- process input arguments --------------------------------------------------- x = double (x); y = double (y); if (nargin >= 4) && (diff ~= -1), stk_error ('diff should be equal to -1', 'InvalidArgument'); end if nargin < 5, pairwise = false; end %--- compute covariance matrix ------------------------------------------------- if ~pairwise, K = param.K(x, y); else idx = sub2ind (size (param.K), x, y); K = param.K(idx); end end % function %!shared model, model2, x0 %! n0 = 20; n1 = 10; dim = 4; %! x0 = stk_sampling_randunif (n0, dim); %! x1 = stk_sampling_randunif (n1, dim); %! model = stk_model ('stk_materncov52_aniso', dim); %! model.lm = stk_lm_affine (); %! model.param = log ([1.0; 2.1; 2.2; 2.3; 2.4]); %!test % without noise, pairwise = false %! model.lognoisevariance = - inf; %! model2 = stk_model ('stk_discretecov', model, x0); %! idx = [1 4 9]; %! [K1, P1] = stk_make_matcov (model, x0(idx, :)); %! [K2, P2] = stk_make_matcov (model2, idx'); %! assert (stk_isequal_tolrel (K1, K2)); %! assert (stk_isequal_tolrel (P1, P2)); %!test % without noise, pairwise = true %! K1 = stk_make_matcov (model, x0([2 5 6], :), [], true); %! K2 = stk_make_matcov (model2, [2 5 6]', [], true); %! assert (stk_isequal_tolrel (K1, K2)); %!test % with noise, pairwise = false %! model.lognoisevariance = log (0.01); %! model2 = stk_model ('stk_discretecov', model, x0); %! idx = [1 4 9]; %! [K1, P1] = stk_make_matcov (model, x0(idx, :)); %! [K2, P2] = stk_make_matcov (model2, idx'); %! assert (stk_isequal_tolrel (K1, K2)); %! assert (stk_isequal_tolrel (P1, P2)); stk/inst/covfcs/stk_expcov_aniso.m0000644000000000000000000001520513156161544014552 0ustar % STK_EXPCOV_ANISO computes the anisotropic exponential covariance function % % CALL: K = stk_expcov_aniso (PARAM, X, Y) % % computes the covariance matrix K between the sets of locations X and Y, % using the exponential covariance kernel with parameters PARAM. The output % matrix K has size NX x NY, where NX is the number of rows in X and NY the % number of rows in Y. The vector of parameters must have DIM + 1 elements, % where DIM is the common number of columns of X and Y: % % * PARAM(1) = log (SIGMA ^ 2), where SIGMA is the standard deviation, % % * PARAM(1+i) = - log (RHO(i)), where RHO(i) is the range parameter % for the ith dimension. % % CALL: dK = stk_expcov_aniso (PARAM, X, Y, DIFF) % % computes the derivative of the covariance matrix with respect to % PARAM(DIFF) if DIFF~= -1, or the covariance matrix itself if DIFF is % equal to -1 (in which case this is equivalent to stk_materncov_aniso % (PARAM, X, Y)). % % CALL: K = stk_expcov_aniso (PARAM, X, Y, DIFF, PAIRWISE) % % computes the covariance vector (or a derivative of it if DIFF > 0) % between the sets of locations X and Y. The output K is a vector of % length N, where N is the common number of rows of X and Y. % Copyright Notice % % Copyright (C) 2015, 2016 CentraleSupelec % Copyright (C) 2011-2014 SUPELEC % % Authors: Julien Bect % Emmanuel Vazquez % Paul Feliot % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function k = stk_expcov_aniso (param, x, y, diff, pairwise) if nargin > 5, stk_error ('Too many input arguments.', 'TooManyInputArgs'); end persistent x0 y0 xs ys param0 pairwise0 D Kx_cache compute_Kx_cache % process input arguments x = double (x); y = double (y); if nargin < 4, diff = -1; end if nargin < 5, pairwise = false; end % check consistency for the number of factors dim = size (x, 2); if (size (y, 2) ~= dim), stk_error ('xi and yi have incompatible sizes.', 'InvalidArgument'); end % check param nb_params = dim + 1; if (numel (param) ~= nb_params) stk_error ('xi and param have incompatible sizes.', 'InvalidArgument'); else param = reshape (param, 1, nb_params); % row vector end % extract parameters from the "param" vector Sigma2 = exp (param(1)); invRho = exp (param(2:end)); % check parameter values if ~ (Sigma2 > 0) || ~ all (invRho >= 0), error ('Incorrect parameter value.'); end % check if all input arguments are the same as before % (or if this is the first call to the function) if isempty (x0) || isempty (y0) || isempty (param0) ... || ~ isequal ({x, y, param}, {x0, y0, param0}) ... || ~ isequal (pairwise, pairwise0) % compute the distance matrix xs = bsxfun (@times, x, invRho); ys = bsxfun (@times, y, invRho); D = stk_dist (xs, ys, pairwise); % save arguments for the next call x0 = x; y0 = y; param0 = param; pairwise0 = pairwise; % recomputation of Kx_cache is required compute_Kx_cache = true; end if diff == -1, %%% compute the value (not a derivative) k = Sigma2 * stk_rbf_exponential (D, -1); elseif diff == 1, %%% diff wrt param(1) = log(Sigma2) k = Sigma2 * stk_rbf_exponential (D, -1); elseif (diff >= 2) && (diff <= nb_params), %%% diff wrt param(diff) = - log(invRho(diff-1)) ind = diff - 1; if compute_Kx_cache || isempty (Kx_cache) Kx_cache = 1 ./ (D + eps) .* (Sigma2 * stk_rbf_exponential (D, 1)); compute_Kx_cache = false; end if pairwise, k = (xs(:, ind) - ys(:, ind)).^2 .* Kx_cache; else k = (bsxfun (@minus, xs(:, ind), ys(:, ind)')) .^ 2 .* Kx_cache; end else stk_error ('Incorrect value for the ''diff'' parameter.', ... 'InvalidArgument'); end end % function %% % 1D, 5x5 %!shared param, x, y, K1, K2, K3 %! dim = 1; %! param = log ([1.0; 2.5]); %! x = stk_sampling_randunif (5, dim); %! y = stk_sampling_randunif (6, dim); %!error K0 = stk_expcov_aniso (); %!error K0 = stk_expcov_aniso (param); %!error K0 = stk_expcov_aniso (param, x); %!test K1 = stk_expcov_aniso (param, x, y); %!test K2 = stk_expcov_aniso (param, x, y, -1); %!test K3 = stk_expcov_aniso (param, x, y, -1, false); %!error K0 = stk_expcov_aniso (param, x, y, -1, false, pi^2); %!assert (isequal (K1, K2)); %!assert (isequal (K1, K3)); %!test % df versus ordinary array %! u = double (x); v = double (y); %! K1 = stk_expcov_aniso (param, u, v, -1); %! K2 = stk_expcov_aniso (param, stk_dataframe (u), stk_dataframe (v), -1); %!error stk_expcov_aniso (param, x, y, -2); %!test stk_expcov_aniso (param, x, y, -1); %!error stk_expcov_aniso (param, x, y, 0); %!test stk_expcov_aniso (param, x, y, 1); %!test stk_expcov_aniso (param, x, y, 2); %!error stk_expcov_aniso (param, x, y, 3); %!error stk_expcov_aniso (param, x, y, nan); %!error stk_expcov_aniso (param, x, y, inf); %% % 3D, 4x10 %!shared dim, param, x, y, nx, ny %! dim = 3; %! param = log ([1.0; 2.5; 2.4; 2.6]); %! nx = 4; ny = 10; %! x = stk_sampling_randunif (nx, dim); %! y = stk_sampling_randunif (ny, dim); %!test %! K1 = stk_expcov_aniso (param, x, y); %! K2 = stk_expcov_aniso (param, x, y, -1); %! assert (isequal (size(K1), [nx ny])); %! assert (stk_isequal_tolabs (K1, K2)); %!test %! for i = 1:(dim + 1), %! dK = stk_expcov_aniso (param, x, y, i); %! assert (isequal (size (dK), [nx ny])); %! end %!test %! n = 7; %! x = stk_sampling_randunif (n, dim); %! y = stk_sampling_randunif (n, dim); %! %! K1 = stk_expcov_aniso (param, x, y); %! K2 = stk_expcov_aniso (param, x, y, -1, true); %! assert (isequal (size (K1), [n n])); %! assert (stk_isequal_tolabs (K2, diag (K1))); %! %! for i = 1:(dim + 1), %! dK1 = stk_expcov_aniso (param, x, y, i); %! dK2 = stk_expcov_aniso (param, x, y, i, true); %! assert (isequal (size (dK1), [n n])); %! assert (stk_isequal_tolabs (dK2, diag (dK1))); %! end stk/inst/covfcs/stk_expcov_iso.m0000644000000000000000000001241413156161544014232 0ustar % STK_EXPCOV_ISO computes the isotropic exponential covariance function % % CALL: K = stk_expcov_iso (PARAM, X, Y) % % computes the covariance matrix K between the sets of locations X and % Y, using the isotropic exponential covariance function with parameters % PARAM. The output matrix K has size NX x NY, where NX is the number of rows % in X and NY the number of rows in Y. The vector of parameters must have two % elements: % % * PARAM(1) = log (SIGMA ^ 2), where SIGMA is the standard deviation, % % * PARAM(2) = - log (RHO), where RHO is the range parameter. % % CALL: dK = stk_expcov_iso (PARAM, X, Y, DIFF) % % computes the derivative of the covariance matrix with respect to % PARAM(DIFF) if DIFF~= -1, or the covariance matrix itself if DIFF is % equal to -1 (in which case this is equivalent to stk_materncov_iso % (PARAM, X, Y)). % % CALL: K = stk_expcov_iso (PARAM, X, Y, DIFF, PAIRWISE) % % computes the covariance vector (or a derivative of it if DIFF > 0) % between the sets of locations X and Y. The output K is a vector of % length N, where N is the common number of rows of X and Y. % Copyright Notice % % Copyright (C) 2016 CentraleSupelec % Copyright (C) 2011-2014 SUPELEC % % Authors: Julien Bect % Emmanuel Vazquez % Paul Feliot % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function k = stk_expcov_iso (param, x, y, diff, pairwise) if nargin > 5, stk_error ('Too many input arguments.', 'TooManyInputArgs'); end persistent x0 y0 param0 pairwise0 D % process input arguments x = double (x); y = double (y); if nargin < 4, diff = -1; end if nargin < 5, pairwise = false; end % extract parameters from the "param" vector Sigma2 = exp (param(1)); invRho = exp (param(2)); % check parameter values if ~ (Sigma2 > 0) || ~ (invRho >= 0), error ('Incorrect parameter value.'); end % check if all input arguments are the same as before % (or if this is the first call to the function) if isempty (x0) || isempty (y0) || isempty (param0) ... || ~ isequal ({x, y, param}, {x0, y0, param0}) ... || ~ isequal (pairwise, pairwise0) % compute the distance matrix D = invRho * stk_dist (x, y, pairwise); % save arguments for the nex call x0 = x; y0 = y; param0 = param; pairwise0 = pairwise; end if diff == -1, %%% compute the value (not a derivative) k = Sigma2 * stk_rbf_exponential (D, -1); elseif diff == 1, %%% diff wrt param(1) = log(Sigma2) k = Sigma2 * stk_rbf_exponential (D, -1); elseif diff == 2, %%% diff wrt param(3) = - log(invRho) k = D .* (Sigma2 * stk_rbf_exponential (D, 1)); else error ('there must be something wrong here !'); end end % function %% % 1D, 5x5 %!shared param, x, y %! dim = 1; %! param = log ([1.0; 2.5]); %! x = stk_sampling_randunif (5, dim); %! y = stk_sampling_randunif (5, dim); %!error stk_expcov_iso (); %!error stk_expcov_iso (param); %!error stk_expcov_iso (param, x); %!test stk_expcov_iso (param, x, y); %!test stk_expcov_iso (param, x, y, -1); %!test stk_expcov_iso (param, x, y, -1, false); %!error stk_expcov_iso (param, x, y, -1, false, pi^2); %!error stk_expcov_iso (param, x, y, -2); %!test stk_expcov_iso (param, x, y, -1); %!error stk_expcov_iso (param, x, y, 0); %!test stk_expcov_iso (param, x, y, 1); %!test stk_expcov_iso (param, x, y, 2); %!error stk_expcov_iso (param, x, y, 3); %!error stk_expcov_iso (param, x, y, nan); %!error stk_expcov_iso (param, x, y, inf); %% % 3D, 4x10 %!shared dim, param, x, y, nx, ny %! dim = 3; %! param = log ([1.0; 2.5]); %! nx = 4; ny = 10; %! x = stk_sampling_randunif (nx, dim); %! y = stk_sampling_randunif (ny, dim); %!test %! K1 = stk_expcov_iso (param, x, y); %! K2 = stk_expcov_iso (param, x, y, -1); %! assert (isequal (size (K1), [nx ny])); %! assert (stk_isequal_tolabs (K1, K2)); %!test %! for i = 1:2, %! dK = stk_expcov_iso (param, x, y, i); %! assert (isequal (size (dK), [nx ny])); %! end %!test %! n = 7; %! x = stk_sampling_randunif (n, dim); %! y = stk_sampling_randunif (n, dim); %! %! K1 = stk_expcov_iso (param, x, y); %! K2 = stk_expcov_iso (param, x, y, -1, true); %! assert (isequal (size (K1), [n n])); %! assert (stk_isequal_tolabs (K2, diag (K1))); %! %! for i = 1:2, %! dK1 = stk_expcov_iso (param, x, y, i); %! dK2 = stk_expcov_iso (param, x, y, i, true); %! assert (isequal (size (dK1), [n n])); %! assert (stk_isequal_tolabs (dK2, diag (dK1))); %! end stk/inst/covfcs/stk_gausscov_aniso.m0000644000000000000000000001530213156161544015076 0ustar % STK_GAUSSCOV_ANISO computes the anisotropic Gaussian covariance function % % CALL: K = stk_gausscov_aniso (PARAM, X, Y) % % computes the covariance matrix K between the sets of locations X and Y, % using the anisotropic Gaussian covariance function with parameters PARAM. % The output matrix K has size NX x NY, where NX is the number of rows in X % and NY the number of rows in Y. The vector of parameters must have DIM + 1 % elements, where DIM is the common number of columns of X and Y: % % * PARAM(1) = log (SIGMA ^ 2), where SIGMA is the standard deviation, % % * PARAM(2:END) = - log (RHO), where RHO is the vector of range parameters. % % CALL: dK = stk_gausscov_aniso (PARAM, X, Y, DIFF) % % computes the derivative of the covariance matrix with respect to PARAM(DIFF) % if DIFF is between 1 and DIM + 1, or the covariance matrix itself if DIFF is % equal to -1 (in which case this is equivalent to stk_gausscov_aniso (PARAM, % X, Y)). % % CALL: K = stk_gausscov_aniso (PARAM, X, Y, DIFF, PAIRWISE) % % computes the covariance vector (or a derivative of it if DIFF > 0) between % the sets of locations X and Y. The output K is a vector of length N, where % N is the common number of rows of X and Y. % % See also: stk_rbf_gauss, stk_gausscov_iso % Copyright Notice % % Copyright (C) 2015, 2016 CentraleSupelec % Copyright (C) 2013, 2014 SUPELEC % % Authors: Julien Bect % Emmanuel Vazquez % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function k = stk_gausscov_aniso (param, x, y, diff, pairwise) if nargin > 5, stk_error ('Too many input arguments.', 'TooManyInputArgs'); end persistent x0 y0 xs ys param0 pairwise0 D Kx_cache compute_Kx_cache % process input arguments x = double (x); y = double (y); if nargin < 4, diff = -1; end if nargin < 5, pairwise = false; end % check consistency for the number of factors dim = size (x, 2); if size (y, 2) ~= dim, stk_error ('xi and yi have incompatible sizes.', 'InvalidArgument'); end % check param nb_params = dim + 1; if length (param) ~= nb_params stk_error ('xi and param have incompatible sizes.', 'InvalidArgument'); else param = reshape (param, 1, nb_params); % row vector end % extract parameters from the "param" vector Sigma2 = exp (param(1)); invRho = exp (param(2:end)); % check parameter values if ~ (Sigma2 > 0) || ~ all (invRho >= 0), error ('Incorrect parameter value.'); end % check if all input arguments are the same as before % (or if this is the first call to the function) if isempty (x0) || isempty (y0) || isempty (param0) || ... ~ isequal ({x, y, param}, {x0, y0, param0}) || ... ~ isequal (pairwise, pairwise0) % compute the distance matrix xs = bsxfun (@times, x, invRho); ys = bsxfun (@times, y, invRho); D = stk_dist (xs, ys, pairwise); % save arguments for the next call x0 = x; y0 = y; param0 = param; pairwise0 = pairwise; % recomputation of Kx_cache is required compute_Kx_cache = true; end if diff == -1, % Compute the value (not a derivative) k = Sigma2 * stk_rbf_gauss (D, -1); elseif diff == 1, % Differentiate wrt param(1) = log (Sigma2) k = Sigma2 * stk_rbf_gauss (D, -1); elseif (diff >= 2) && (diff <= nb_params), % Differentiate wrt param(diff) = - log (invRho(diff-1)) ind = diff - 1; if compute_Kx_cache || isempty (Kx_cache) Kx_cache = 1 ./ (D + eps) .* (Sigma2 * stk_rbf_gauss (D, 1)); compute_Kx_cache = false; end if pairwise, k = ((xs(:, ind) - ys(:, ind)) .^ 2) .* Kx_cache; else k = (bsxfun (@minus, xs(:, ind), ys(:, ind)')) .^ 2 .* Kx_cache; end else stk_error ('Incorrect value for the ''diff'' parameter.', ... 'InvalidArgument'); end end % function %% % 1D, 5x5 %!shared param, x, y, K1, K2, K3 %! dim = 1; %! param = log ([1.0; 2.5]); %! x = stk_sampling_randunif (5, dim); %! y = stk_sampling_randunif (6, dim); %!error K0 = stk_gausscov_aniso (); %!error K0 = stk_gausscov_aniso (param); %!error K0 = stk_gausscov_aniso (param, x); %!test K1 = stk_gausscov_aniso (param, x, y); %!test K2 = stk_gausscov_aniso (param, x, y, -1); %!test K3 = stk_gausscov_aniso (param, x, y, -1, false); %!error K0 = stk_gausscov_aniso (param, x, y, -1, false, pi^2); %!assert (isequal (K1, K2)); %!assert (isequal (K1, K3)); %!test % df versus ordinary array %! u = double (x); v = double (y); %! K1 = stk_gausscov_aniso (param, u, v, -1); %! K2 = stk_gausscov_aniso (param, stk_dataframe (u), stk_dataframe (v), -1); %!error stk_gausscov_aniso (param, x, y, -2); %!test stk_gausscov_aniso (param, x, y, -1); %!error stk_gausscov_aniso (param, x, y, 0); %!test stk_gausscov_aniso (param, x, y, 1); %!test stk_gausscov_aniso (param, x, y, 2); %!error stk_gausscov_aniso (param, x, y, 3); %!error stk_gausscov_aniso (param, x, y, nan); %!error stk_gausscov_aniso (param, x, y, inf); %% % 3D, 4x10 %!shared dim, param, x, y, nx, ny %! dim = 3; %! param = log ([1.0; 2.5; 2.4; 2.6]); %! nx = 4; ny = 10; %! x = stk_sampling_randunif (nx, dim); %! y = stk_sampling_randunif (ny, dim); %!test %! K1 = stk_gausscov_aniso (param, x, y); %! K2 = stk_gausscov_aniso (param, x, y, -1); %! assert (isequal (size (K1), [nx ny])); %! assert (stk_isequal_tolabs (K1, K2)); %!test %! for i = 1:(dim + 1), %! dK = stk_gausscov_aniso (param, x, y, i); %! assert (isequal (size (dK), [nx ny])); %! end %!test %! n = 7; %! x = stk_sampling_randunif (n, dim); %! y = stk_sampling_randunif (n, dim); %! %! K1 = stk_gausscov_aniso (param, x, y); %! K2 = stk_gausscov_aniso (param, x, y, -1, true); %! assert (isequal (size (K1), [n n])); %! assert (stk_isequal_tolabs (K2, diag (K1))); %! %! for i = 1:(dim + 1), %! dK1 = stk_gausscov_aniso (param, x, y, i); %! dK2 = stk_gausscov_aniso (param, x, y, i, true); %! assert (isequal (size (dK1), [n n])); %! assert (stk_isequal_tolabs (dK2, diag (dK1))); %! end stk/inst/covfcs/stk_gausscov_iso.m0000644000000000000000000001244313156161544014562 0ustar % STK_GAUSSCOV_ISO computes the isotropic Gaussian covariance function % % CALL: K = stk_gausscov_iso (PARAM, X, Y) % % computes the covariance matrix K between the sets of locations X and Y, % using the isotropic Gaussian covariance function with parameters PARAM. The % output matrix K has size NX x NY, where NX is the number of rows in X and NY % the number of rows in Y. The vector of parameters must have two elements: % % * PARAM(1) = log (SIGMA ^ 2), where SIGMA is the standard deviation, % % * PARAM(2) = - log (RHO), where RHO is the range parameter. % % CALL: dK = stk_gausscov_iso (PARAM, X, Y, DIFF) % % computes the derivative of the covariance matrix with respect to PARAM(DIFF) % if DIFF is equal to 1 or 2, or the covariance matrix itself if DIFF is equal % to -1 (in which case this is equivalent to stk_gausscov_iso (PARAM, X, Y)). % % CALL: K = stk_gausscov_iso (PARAM, X, Y, DIFF, PAIRWISE) % % computes the covariance vector (or a derivative of it if DIFF > 0) between % the sets of locations X and Y. The output K is a vector of length N, where % N is the common number of rows of X and Y. % % See also: stk_rbf_gauss, stk_gausscov_aniso % Copyright Notice % % Copyright (C) 2015, 2016 CentraleSupelec % Copyright (C) 2013 SUPELEC % % Authors: Julien Bect % Emmanuel Vazquez % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function k = stk_gausscov_iso (param, x, y, diff, pairwise) if nargin > 5, stk_error ('Too many input arguments.', 'TooManyInputArgs'); end persistent x0 y0 param0 pairwise0 D % process input arguments x = double (x); y = double (y); if nargin < 4, diff = -1; end if nargin < 5, pairwise = false; end % extract parameters from the "param" vector Sigma2 = exp (param(1)); invRho = exp (param(2)); % check parameter values if ~ (Sigma2 > 0) || ~ (invRho > 0), error ('Incorrect parameter value.'); end % check if all input arguments are the same as before % (or if this is the first call to the function) if isempty (x0) || isempty (y0) || isempty (param0) || ... ~ isequal ({x, y, param}, {x0, y0, param0}) || ... ~ isequal (pairwise, pairwise0) % compute the distance matrix D = invRho * stk_dist (x, y, pairwise); % save arguments for the nex call x0 = x; y0 = y; param0 = param; pairwise0 = pairwise; end if diff == -1, % compute the value (not a derivative) k = Sigma2 * stk_rbf_gauss (D, -1); elseif diff == 1, % diff wrt param(1) = log(Sigma2) k = Sigma2 * stk_rbf_gauss (D, -1); elseif diff == 2, % diff wrt param(3) = - log(invRho) k = D .* (Sigma2 * stk_rbf_gauss (D, 1)); else error('there must be something wrong here !'); end end % function %% % 1D, 5x5 %!shared param, x, y %! dim = 1; %! param = log ([1.0; 2.5]); %! x = stk_sampling_randunif (5, dim); %! y = stk_sampling_randunif (5, dim); %!error stk_gausscov_iso (); %!error stk_gausscov_iso (param); %!error stk_gausscov_iso (param, x); %!test stk_gausscov_iso (param, x, y); %!test stk_gausscov_iso (param, x, y, -1); %!test stk_gausscov_iso (param, x, y, -1, false); %!error stk_gausscov_iso (param, x, y, -1, false, pi^2); %!error stk_gausscov_iso (param, x, y, -2); %!test stk_gausscov_iso (param, x, y, -1); %!error stk_gausscov_iso (param, x, y, 0); %!test stk_gausscov_iso (param, x, y, 1); %!test stk_gausscov_iso (param, x, y, 2); %!error stk_gausscov_iso (param, x, y, 3); %!error stk_gausscov_iso (param, x, y, nan); %!error stk_gausscov_iso (param, x, y, inf); %% % 3D, 4x10 %!shared dim, param, x, y, nx, ny %! dim = 3; %! param = log ([1.0; 2.5]); %! nx = 4; ny = 10; %! x = stk_sampling_randunif (nx, dim); %! y = stk_sampling_randunif (ny, dim); %!test %! K1 = stk_gausscov_iso (param, x, y); %! K2 = stk_gausscov_iso (param, x, y, -1); %! assert (isequal (size (K1), [nx ny])); %! assert (stk_isequal_tolabs (K1, K2)); %!test %! for i = 1:2, %! dK = stk_gausscov_iso (param, x, y, i); %! assert (isequal (size (dK), [nx ny])); %! end %!test %! n = 7; %! x = stk_sampling_randunif (n, dim); %! y = stk_sampling_randunif (n, dim); %! %! K1 = stk_gausscov_iso (param, x, y); %! K2 = stk_gausscov_iso (param, x, y, -1, true); %! assert (isequal (size (K1), [n n])); %! assert (stk_isequal_tolabs (K2, diag (K1))); %! %! for i = 1:2, %! dK1 = stk_gausscov_iso (param, x, y, i); %! dK2 = stk_gausscov_iso (param, x, y, i, true); %! assert (isequal (size (dK1), [n n])); %! assert (stk_isequal_tolabs (dK2, diag (dK1))); %! end stk/inst/covfcs/stk_materncov32_aniso.m0000644000000000000000000001547713156161544015424 0ustar % STK_MATERNCOV32_ANISO computes the anisotropic Matern covariance with nu=3/2 % % CALL: K = stk_materncov32_aniso (PARAM, X, Y) % % computes the covariance matrix K between the sets of locations X and Y, % using the anisotropic Matern covariance kernel with nu=3/2 and % parameters PARAM. The output matrix K has size NX x NY, where NX is the % number of rows in X and NY the number of rows in Y. The vector of % parameters must have DIM + 1 elements, where DIM is the common number % of columns of X and Y: % % * PARAM(1) = log (SIGMA ^ 2), where SIGMA is the standard deviation, % % * PARAM(1+i) = - log (RHO(i)), where RHO(i) is the range parameter % for the ith dimension. % % CALL: dK = stk_materncov32_aniso (PARAM, X, Y, DIFF) % % computes the derivative of the covariance matrix with respect to % PARAM(DIFF) if DIFF~= -1, or the covariance matrix itself if DIFF is % equal to -1 (in which case this is equivalent to stk_materncov_aniso % (PARAM, X, Y)). % % CALL: K = stk_materncov32_aniso (PARAM, X, Y, DIFF, PAIRWISE) % % computes the covariance vector (or a derivative of it if DIFF > 0) % between the sets of locations X and Y. The output K is a vector of % length N, where N is the common number of rows of X and Y. % Copyright Notice % % Copyright (C) 2015, 2016 CentraleSupelec % Copyright (C) 2011-2014 SUPELEC % % Authors: Julien Bect % Emmanuel Vazquez % Paul Feliot % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function k = stk_materncov32_aniso (param, x, y, diff, pairwise) if nargin > 5, stk_error ('Too many input arguments.', 'TooManyInputArgs'); end persistent x0 y0 xs ys param0 pairwise0 D Kx_cache compute_Kx_cache % process input arguments x = double (x); y = double (y); if nargin < 4, diff = -1; end if nargin < 5, pairwise = false; end % check consistency for the number of factors dim = size (x, 2); if (size (y, 2) ~= dim), stk_error ('xi and yi have incompatible sizes.', 'InvalidArgument'); end % check param nb_params = dim + 1; if (numel (param) ~= nb_params) stk_error ('xi and param have incompatible sizes.', 'InvalidArgument'); else param = reshape (param, 1, nb_params); % row vector end % extract parameters from the "param" vector Sigma2 = exp (param(1)); invRho = exp (param(2:end)); % check parameter values if ~ (Sigma2 > 0) || ~ all (invRho >= 0), error ('Incorrect parameter value.'); end % check if all input arguments are the same as before % (or if this is the first call to the function) if isempty (x0) || isempty (y0) || isempty (param0) ... || ~ isequal ({x, y, param}, {x0, y0, param0}) ... || ~ isequal (pairwise, pairwise0) % compute the distance matrix xs = bsxfun (@times, x, invRho); ys = bsxfun (@times, y, invRho); D = stk_dist (xs, ys, pairwise); % save arguments for the next call x0 = x; y0 = y; param0 = param; pairwise0 = pairwise; % recomputation of Kx_cache is required compute_Kx_cache = true; end if diff == -1, %%% compute the value (not a derivative) k = Sigma2 * stk_rbf_matern32 (D, -1); elseif diff == 1, %%% diff wrt param(1) = log(Sigma2) k = Sigma2 * stk_rbf_matern32 (D, -1); elseif (diff >= 2) && (diff <= nb_params), %%% diff wrt param(diff) = - log(invRho(diff-1)) ind = diff - 1; if compute_Kx_cache || isempty (Kx_cache) Kx_cache = 1 ./ (D + eps) .* (Sigma2 * stk_rbf_matern32 (D, 1)); compute_Kx_cache = false; end if pairwise, k = (xs(:, ind) - ys(:, ind)).^2 .* Kx_cache; else k = (bsxfun (@minus, xs(:, ind), ys(:, ind)')) .^ 2 .* Kx_cache; end else stk_error ('Incorrect value for the ''diff'' parameter.', ... 'InvalidArgument'); end end % function %% % 1D, 5x5 %!shared param, x, y, K1, K2, K3 %! dim = 1; %! param = log ([1.0; 2.5]); %! x = stk_sampling_randunif (5, dim); %! y = stk_sampling_randunif (6, dim); %!error K0 = stk_materncov32_aniso (); %!error K0 = stk_materncov32_aniso (param); %!error K0 = stk_materncov32_aniso (param, x); %!test K1 = stk_materncov32_aniso (param, x, y); %!test K2 = stk_materncov32_aniso (param, x, y, -1); %!test K3 = stk_materncov32_aniso (param, x, y, -1, false); %!error K0 = stk_materncov32_aniso (param, x, y, -1, false, pi^2); %!assert (isequal (K1, K2)); %!assert (isequal (K1, K3)); %!test % df versus ordinary array %! u = double (x); v = double (y); %! K1 = stk_materncov32_aniso (param, u, v, -1); %! K2 = stk_materncov32_aniso (param, stk_dataframe (u), stk_dataframe (v), -1); %! assert (isequal (K1, K2)); %!error stk_materncov32_aniso (param, x, y, -2); %!test stk_materncov32_aniso (param, x, y, -1); %!error stk_materncov32_aniso (param, x, y, 0); %!test stk_materncov32_aniso (param, x, y, 1); %!test stk_materncov32_aniso (param, x, y, 2); %!error stk_materncov32_aniso (param, x, y, 3); %!error stk_materncov32_aniso (param, x, y, nan); %!error stk_materncov32_aniso (param, x, y, inf); %% % 3D, 4x10 %!shared dim, param, x, y, nx, ny %! dim = 3; %! param = log ([1.0; 2.5; 2.4; 2.6]); %! nx = 4; ny = 10; %! x = stk_sampling_randunif (nx, dim); %! y = stk_sampling_randunif (ny, dim); %!test %! K1 = stk_materncov32_aniso (param, x, y); %! K2 = stk_materncov32_aniso (param, x, y, -1); %! assert (isequal (size(K1), [nx ny])); %! assert (stk_isequal_tolabs (K1, K2)); %!test %! for i = 1:(dim + 1), %! dK = stk_materncov32_aniso (param, x, y, i); %! assert (isequal (size (dK), [nx ny])); %! end %!test %! n = 7; %! x = stk_sampling_randunif (n, dim); %! y = stk_sampling_randunif (n, dim); %! %! K1 = stk_materncov32_aniso (param, x, y); %! K2 = stk_materncov32_aniso (param, x, y, -1, true); %! assert (isequal (size (K1), [n n])); %! assert (stk_isequal_tolabs (K2, diag (K1))); %! %! for i = 1:(dim + 1), %! dK1 = stk_materncov32_aniso (param, x, y, i); %! dK2 = stk_materncov32_aniso (param, x, y, i, true); %! assert (isequal (size (dK1), [n n])); %! assert (stk_isequal_tolabs (dK2, diag (dK1))); %! end stk/inst/covfcs/stk_materncov32_iso.m0000644000000000000000000001261413156161544015073 0ustar % STK_MATERNCOV32_ISO computes the isotropic Matern covariance with nu=3/2 % % CALL: K = stk_materncov32_iso (PARAM, X, Y) % % computes the covariance matrix K between the sets of locations X and % Y, using the isotropic Matern covariance kernel with nu=3/2 and % parameters PARAM. The output matrix K has size NX x NY, where NX is % the number of rows in X and NY the number of rows in Y. The vector of % parameters must have two elements: % % * PARAM(1) = log (SIGMA ^ 2), where SIGMA is the standard deviation, % % * PARAM(2) = - log (RHO), where RHO is the range parameter. % % CALL: dK = stk_materncov32_iso (PARAM, X, Y, DIFF) % % computes the derivative of the covariance matrix with respect to % PARAM(DIFF) if DIFF~= -1, or the covariance matrix itself if DIFF is % equal to -1 (in which case this is equivalent to stk_materncov_iso % (PARAM, X, Y)). % % CALL: K = stk_materncov32_iso (PARAM, X, Y, DIFF, PAIRWISE) % % computes the covariance vector (or a derivative of it if DIFF > 0) % between the sets of locations X and Y. The output K is a vector of % length N, where N is the common number of rows of X and Y. % Copyright Notice % % Copyright (C) 2016 CentraleSupelec % Copyright (C) 2011-2014 SUPELEC % % Authors: Julien Bect % Emmanuel Vazquez % Paul Feliot % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function k = stk_materncov32_iso (param, x, y, diff, pairwise) if nargin > 5, stk_error ('Too many input arguments.', 'TooManyInputArgs'); end persistent x0 y0 param0 pairwise0 D % process input arguments x = double (x); y = double (y); if nargin < 4, diff = -1; end if nargin < 5, pairwise = false; end % extract parameters from the "param" vector Sigma2 = exp (param(1)); invRho = exp (param(2)); % check parameter values if ~ (Sigma2 > 0) || ~ (invRho >= 0), error ('Incorrect parameter value.'); end % check if all input arguments are the same as before % (or if this is the first call to the function) if isempty (x0) || isempty (y0) || isempty (param0) ... || ~ isequal ({x, y, param}, {x0, y0, param0}) ... || ~ isequal (pairwise, pairwise0) % compute the distance matrix D = invRho * stk_dist (x, y, pairwise); % save arguments for the nex call x0 = x; y0 = y; param0 = param; pairwise0 = pairwise; end if diff == -1, %%% compute the value (not a derivative) k = Sigma2 * stk_rbf_matern32 (D, -1); elseif diff == 1, %%% diff wrt param(1) = log(Sigma2) k = Sigma2 * stk_rbf_matern32 (D, -1); elseif diff == 2, %%% diff wrt param(3) = - log(invRho) k = D .* (Sigma2 * stk_rbf_matern32 (D, 1)); else error ('there must be something wrong here !'); end end % function %% % 1D, 5x5 %!shared param, x, y %! dim = 1; %! param = log ([1.0; 2.5]); %! x = stk_sampling_randunif (5, dim); %! y = stk_sampling_randunif (5, dim); %!error stk_materncov32_iso (); %!error stk_materncov32_iso (param); %!error stk_materncov32_iso (param, x); %!test stk_materncov32_iso (param, x, y); %!test stk_materncov32_iso (param, x, y, -1); %!test stk_materncov32_iso (param, x, y, -1, false); %!error stk_materncov32_iso (param, x, y, -1, false, pi^2); %!error stk_materncov32_iso (param, x, y, -2); %!test stk_materncov32_iso (param, x, y, -1); %!error stk_materncov32_iso (param, x, y, 0); %!test stk_materncov32_iso (param, x, y, 1); %!test stk_materncov32_iso (param, x, y, 2); %!error stk_materncov32_iso (param, x, y, 3); %!error stk_materncov32_iso (param, x, y, nan); %!error stk_materncov32_iso (param, x, y, inf); %% % 3D, 4x10 %!shared dim, param, x, y, nx, ny %! dim = 3; %! param = log ([1.0; 2.5]); %! nx = 4; ny = 10; %! x = stk_sampling_randunif (nx, dim); %! y = stk_sampling_randunif (ny, dim); %!test %! K1 = stk_materncov32_iso (param, x, y); %! K2 = stk_materncov32_iso (param, x, y, -1); %! assert (isequal (size (K1), [nx ny])); %! assert (stk_isequal_tolabs (K1, K2)); %!test %! for i = 1:2, %! dK = stk_materncov32_iso (param, x, y, i); %! assert (isequal (size (dK), [nx ny])); %! end %!test %! n = 7; %! x = stk_sampling_randunif (n, dim); %! y = stk_sampling_randunif (n, dim); %! %! K1 = stk_materncov32_iso (param, x, y); %! K2 = stk_materncov32_iso (param, x, y, -1, true); %! assert (isequal (size (K1), [n n])); %! assert (stk_isequal_tolabs (K2, diag (K1))); %! %! for i = 1:2, %! dK1 = stk_materncov32_iso (param, x, y, i); %! dK2 = stk_materncov32_iso (param, x, y, i, true); %! assert (isequal (size (dK1), [n n])); %! assert (stk_isequal_tolabs (dK2, diag (dK1))); %! end stk/inst/covfcs/stk_materncov52_aniso.m0000644000000000000000000001475413156161544015423 0ustar % STK_MATERNCOV52_ANISO computes the anisotropic Matern covariance with nu=5/2 % % CALL: K = stk_materncov52_aniso (PARAM, X, Y) % % computes the covariance matrix K between the sets of locations X and Y, % using the anisotropic Matern covariance kernel with nu=5/2 and % parameters PARAM. The output matrix K has size NX x NY, where NX is the % number of rows in X and NY the number of rows in Y. The vector of % parameters must have DIM + 1 elements, where DIM is the common number % of columns of X and Y: % % * PARAM(1) = log (SIGMA ^ 2), where SIGMA is the standard deviation, % % * PARAM(1+i) = - log (RHO(i)), where RHO(i) is the range parameter for % the i-th dimension. % % CALL: dK = stk_materncov52_aniso (PARAM, X, Y, DIFF) % % computes the derivative of the covariance matrix with respect to % PARAM(DIFF) if DIFF~= -1, or the covariance matrix itself if DIFF is % equal to -1 (in which case this is equivalent to stk_materncov_aniso % (PARAM, X, Y)). % % CALL: K = stk_materncov52_aniso (PARAM, X, Y, DIFF, PAIRWISE) % % computes the covariance vector (or a derivative of it if DIFF > 0) % between the sets of locations X and Y. The output K is a vector of % length N, where N is the common number of rows of X and Y. % Copyright Notice % % Copyright (C) 2015, 2016 CentraleSupelec % Copyright (C) 2011-2014 SUPELEC % % Authors: Julien Bect % Emmanuel Vazquez % Paul Feliot % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function k = stk_materncov52_aniso (param, x, y, diff, pairwise) if nargin > 5, stk_error ('Too many input arguments.', 'TooManyInputArgs'); end persistent x0 y0 xs ys param0 pairwise0 D Kx_cache compute_Kx_cache % process input arguments x = double (x); y = double (y); if nargin < 4, diff = -1; end if nargin < 5, pairwise = false; end % check consistency for the number of factors dim = size (x, 2); if (size (y, 2) ~= dim), stk_error ('xi and yi have incompatible sizes.', 'InvalidArgument'); end % check param nb_params = dim + 1; if (numel (param) ~= nb_params) stk_error ('xi and param have incompatible sizes.', 'InvalidArgument'); else param = reshape (param, 1, nb_params); % row vector end % extract parameters from the "param" vector Sigma2 = exp (param(1)); invRho = exp (param(2:end)); % check parameter values if ~ (Sigma2 > 0) || ~ all (invRho >= 0), error ('Incorrect parameter value.'); end % check if all input arguments are the same as before % (or if this is the first call to the function) if isempty (x0) || isempty (y0) || isempty (param0) ... || ~ isequal ({x, y, param}, {x0, y0, param0}) ... || ~ isequal (pairwise, pairwise0) % compute the distance matrix xs = bsxfun (@times, x, invRho); ys = bsxfun (@times, y, invRho); D = stk_dist (xs, ys, pairwise); % save arguments for the next call x0 = x; y0 = y; param0 = param; pairwise0 = pairwise; % recomputation of Kx_cache is required compute_Kx_cache = true; end if diff == -1, %%% compute the value (not a derivative) k = Sigma2 * stk_rbf_matern52 (D, -1); elseif diff == 1, %%% diff wrt param(1) = log(Sigma2) k = Sigma2 * stk_rbf_matern52 (D, -1); elseif (diff >= 2) && (diff <= nb_params), %%% diff wrt param(diff) = - log(invRho(diff-1)) ind = diff - 1; if compute_Kx_cache || isempty (Kx_cache) Kx_cache = 1 ./ (D + eps) .* (Sigma2 * stk_rbf_matern52 (D, 1)); compute_Kx_cache = false; end if pairwise, k = (xs(:, ind) - ys(:, ind)).^2 .* Kx_cache; else k = (bsxfun (@minus, xs(:, ind), ys(:, ind)')) .^ 2 .* Kx_cache; end else stk_error ('Incorrect value for the ''diff'' parameter.', ... 'InvalidArgument'); end end % function %% % 1D, 5x5 %!shared param, x, y %! dim = 1; %! param = log ([1.0; 2.5]); %! x = stk_sampling_randunif (5, dim); %! y = stk_sampling_randunif (5, dim); %!error stk_materncov52_aniso (); %!error stk_materncov52_aniso (param); %!error stk_materncov52_aniso (param, x); %!test stk_materncov52_aniso (param, x, y); %!test stk_materncov52_aniso (param, x, y, -1); %!test stk_materncov52_aniso (param, x, y, -1, false); %!error stk_materncov52_aniso (param, x, y, -1, false, pi^2); %!error stk_materncov52_aniso (param, x, y, -2); %!test stk_materncov52_aniso (param, x, y, -1); %!error stk_materncov52_aniso (param, x, y, 0); %!test stk_materncov52_aniso (param, x, y, 1); %!test stk_materncov52_aniso (param, x, y, 2); %!error stk_materncov52_aniso (param, x, y, 3); %!error stk_materncov52_aniso (param, x, y, nan); %!error stk_materncov52_aniso (param, x, y, inf); %% % 3D, 4x10 %!shared dim, param, x, y, nx, ny %! dim = 3; %! param = log ([1.0; 2.5; 2.4; 2.6]); %! nx = 4; ny = 10; %! x = stk_sampling_randunif (nx, dim); %! y = stk_sampling_randunif (ny, dim); %!test %! K1 = stk_materncov52_aniso (param, x, y); %! K2 = stk_materncov52_aniso (param, x, y, -1); %! assert (isequal (size (K1), [nx ny])); %! assert (stk_isequal_tolabs (K1, K2)); %!test %! for i = 1:(dim + 1), %! dK = stk_materncov52_aniso (param, x, y, i); %! assert (isequal (size (dK), [nx ny])); %! end %!test %! n = 7; %! x = stk_sampling_randunif (n, dim); %! y = stk_sampling_randunif (n, dim); %! %! K1 = stk_materncov52_aniso (param, x, y); %! K2 = stk_materncov52_aniso(param, x, y, -1, true); %! assert (isequal (size (K1), [n n])); %! assert (stk_isequal_tolabs (K2, diag (K1))); %! %! for i = 1:(dim + 1), %! dK1 = stk_materncov52_aniso (param, x, y, i); %! dK2 = stk_materncov52_aniso (param, x, y, i, true); %! assert (isequal (size (dK1), [n n])); %! assert (stk_isequal_tolabs (dK2, diag (dK1))); %! end stk/inst/covfcs/stk_materncov52_iso.m0000644000000000000000000001260313156161544015073 0ustar % STK_MATERNCOV52_ISO computes the isotropic Matern covariance % % CALL: K = stk_materncov52_iso (PARAM, X, Y) % % computes the covariance matrix K between the sets of locations X and Y, % using the isotropic Matern covariance kernel with nu=5/2 and parameters % PARAM. The output matrix K has size NX x NY, where NX is the number of % rows in X and NY the number of rows in Y. The vector of parameters must % have two elements: % % * PARAM(1) = log (SIGMA ^ 2), where SIGMA is the standard deviation, % % * PARAM(2) = - log (RHO), where RHO is the range parameter. % % CALL: dK = stk_materncov52_iso (PARAM, X, Y, DIFF) % % computes the derivative of the covariance matrix with respect to % PARAM(DIFF) if DIFF~= -1, or the covariance matrix itself if DIFF is % equal to -1 (in which case this is equivalent to stk_materncov_iso % (PARAM, X, Y)). % % CALL: K = stk_materncov52_iso (PARAM, X, Y, DIFF, PAIRWISE) % % computes the covariance vector (or a derivative of it if DIFF > 0) % between the sets of locations X and Y. The output K is a vector of % length N, where N is the common number of rows of X and Y. % Copyright Notice % % Copyright (C) 2015, 2016 CentraleSupelec % Copyright (C) 2011-2014 SUPELEC % % Authors: Julien Bect % Emmanuel Vazquez % Paul Feliot % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function k = stk_materncov52_iso (param, x, y, diff, pairwise) if nargin > 5, stk_error ('Too many input arguments.', 'TooManyInputArgs'); end persistent x0 y0 param0 pairwise0 D % process input arguments x = double (x); y = double (y); if nargin < 4, diff = -1; end if nargin < 5, pairwise = false; end % extract parameters from the "param" vector Sigma2 = exp (param(1)); invRho = exp (param(2)); % check parameter values if ~ (Sigma2 > 0) || ~ (invRho >= 0), error ('Incorrect parameter value.'); end % check if all input arguments are the same as before % (or if this is the first call to the function) if isempty (x0) || isempty (y0) || isempty (param0) ... || ~ isequal ({x, y, param}, {x0, y0, param0}) ... || ~ isequal (pairwise, pairwise0) % compute the distance matrix D = invRho * stk_dist (x, y, pairwise); % save arguments for the nex call x0 = x; y0 = y; param0 = param; pairwise0 = pairwise; end if diff == -1, %%% compute the value (not a derivative) k = Sigma2 * stk_rbf_matern52 (D, -1); elseif diff == 1, %%% diff wrt param(1) = log(Sigma2) k = Sigma2 * stk_rbf_matern52 (D, -1); elseif diff == 2, %%% diff wrt param(3) = - log(invRho) k = D .* (Sigma2 * stk_rbf_matern52 (D, 1)); else error ('there must be something wrong here !'); end end % function %% % 1D, 5x5 %!shared param, x, y %! dim = 1; %! param = log ([1.0; 2.5]); %! x = stk_sampling_randunif (5, dim); %! y = stk_sampling_randunif (5, dim); %!error stk_materncov52_iso (); %!error stk_materncov52_iso (param); %!error stk_materncov52_iso (param, x); %!test stk_materncov52_iso (param, x, y); %!test stk_materncov52_iso (param, x, y, -1); %!test stk_materncov52_iso (param, x, y, -1, false); %!error stk_materncov52_iso (param, x, y, -1, false, pi^2); %!error stk_materncov52_iso (param, x, y, -2); %!test stk_materncov52_iso (param, x, y, -1); %!error stk_materncov52_iso (param, x, y, 0); %!test stk_materncov52_iso (param, x, y, 1); %!test stk_materncov52_iso (param, x, y, 2); %!error stk_materncov52_iso (param, x, y, 3); %!error stk_materncov52_iso (param, x, y, nan); %!error stk_materncov52_iso (param, x, y, inf); %% % 3D, 4x10 %!shared dim, param, x, y, nx, ny %! dim = 3; %! param = log ([1.0; 2.5]); %! nx = 4; ny = 10; %! x = stk_sampling_randunif (nx, dim); %! y = stk_sampling_randunif (ny, dim); %!test %! K1 = stk_materncov52_iso (param, x, y); %! K2 = stk_materncov52_iso (param, x, y, -1); %! assert (isequal (size (K1), [nx ny])); %! assert (stk_isequal_tolabs (K1, K2)); %!test %! for i = 1:2, %! dK = stk_materncov52_iso (param, x, y, i); %! assert (isequal (size (dK), [nx ny])); %! end %!test %! n = 7; %! x = stk_sampling_randunif (n, dim); %! y = stk_sampling_randunif (n, dim); %! %! K1 = stk_materncov52_iso (param, x, y); %! K2 = stk_materncov52_iso (param, x, y, -1, true); %! assert (isequal (size (K1), [n n])); %! assert (stk_isequal_tolabs (K2, diag (K1))); %! %! for i = 1:2, %! dK1 = stk_materncov52_iso (param, x, y, i); %! dK2 = stk_materncov52_iso (param, x, y, i, true); %! assert (isequal (size (dK1), [n n])); %! assert (stk_isequal_tolabs (dK2, diag (dK1))); %! end stk/inst/covfcs/stk_materncov_aniso.m0000644000000000000000000001513413156161544015245 0ustar % STK_MATERNCOV_ANISO computes the anisotropic Matern covariance % % CALL: K = stk_materncov_aniso (PARAM, X, Y) % % computes the covariance matrix K between the sets of locations X and Y, % using the anisotropic Matern covariance kernel with parameters PARAM. % The output matrix K has size NX x NY, where NX is the number of rows in % X and NY the number of rows in Y. The vector of parameters must have % DIM + 1 elements, where DIM is the common number of columns of X and Y: % % * PARAM(1) = log (SIGMA ^ 2), where SIGMA is the standard deviation, % % * PARAM(2) = log(NU), where NU is the regularity parameter, % % * PARAM(2+i) = - log (RHO(i)), where RHO(i) is the range parameter for % the ith dimension. % % CALL: dK = stk_materncov_aniso (PARAM, X, Y, DIFF) % % computes the derivative of the covariance matrix with respect to % PARAM(DIFF) if DIFF~= -1, or the covariance matrix itself if DIFF is % equal to -1 (in which case this is equivalent to stk_materncov_aniso % (PARAM, X, Y)). % % CALL: K = stk_materncov_aniso (PARAM, X, Y, DIFF, PAIRWISE) % % computes the covariance vector (or a derivative of it if DIFF > 0) % between the sets of locations X and Y. The output K is a vector of % length N, where N is the common number of rows of X and Y. % Copyright Notice % % Copyright (C) 2015, 2016 CentraleSupelec % Copyright (C) 2011-2014 SUPELEC % % Authors: Julien Bect % Emmanuel Vazquez % Paul Feliot % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function k = stk_materncov_aniso (param, x, y, diff, pairwise) if nargin > 5, stk_error ('Too many input arguments.', 'TooManyInputArgs'); end persistent x0 y0 xs ys param0 pairwise0 D Kx_cache compute_Kx_cache % process input arguments x = double (x); y = double (y); if nargin < 4, diff = -1; end if nargin < 5, pairwise = false; end % check size consistency dim = size (x, 2); if (size (y, 2) ~= dim), stk_error ('xi and yi have incompatible sizes.', 'InvalidArgument'); end % check param nb_params = dim + 2; if (numel (param) ~= nb_params) stk_error ('xi and param have incompatible sizes.', 'InvalidArgument'); else param = reshape (param, 1, nb_params); % row vector end % extract parameters from the "param" vector Sigma2 = exp (param(1)); Nu = exp (param(2)); invRho = exp (param(3:end)); % check parameter values if ~ (Sigma2 > 0) || ~ (Nu > 0) || ~ all (invRho >= 0), error ('Incorrect parameter value.'); end % check if all input arguments are the same as before % (or if this is the first call to the function) if isempty (x0) || isempty (y0) || isempty (param0) ... || ~ isequal ({x, y, param}, {x0, y0, param0}) ... || ~ isequal (pairwise, pairwise0) % compute the distance matrix xs = bsxfun (@times, x, invRho); ys = bsxfun (@times, y, invRho); D = stk_dist (xs, ys, pairwise); % save arguments for the next call x0 = x; y0 = y; param0 = param; pairwise0 = pairwise; % recomputation of Kx_cache is required compute_Kx_cache = true; end if diff == -1, %%% compute the value (not a derivative) k = Sigma2 * stk_rbf_matern (Nu, D, -1); elseif diff == 1, %%% diff wrt param(1) = log(Sigma2) k = Sigma2 * stk_rbf_matern (Nu, D, -1); elseif diff == 2, %%% diff wrt param(2) = log(Nu) k = Nu * Sigma2 * stk_rbf_matern (Nu, D, 1); elseif (diff >= 3) && (diff <= nb_params), %%% diff wrt param(diff) = - log(invRho(diff-2)) ind = diff - 2; if compute_Kx_cache || isempty (Kx_cache) Kx_cache = 1./(D+eps) .* (Sigma2 * stk_rbf_matern (Nu, D, 2)); compute_Kx_cache = false; end if pairwise, k = (xs(:, ind) - ys(:, ind)) .^ 2 .* Kx_cache; else k = (bsxfun (@minus, xs(:, ind), ys(:, ind)')) .^ 2 .* Kx_cache; end else stk_error ('Incorrect value for the ''diff'' parameter.', ... 'InvalidArgument'); end end % function %% % 1D, 5x5 %!shared param, x, y %! dim = 1; %! param = log ([1.0; 1.5; 2.8]); %! x = stk_sampling_randunif(5, dim); %! y = stk_sampling_randunif(5, dim); %!error stk_materncov_aniso(); %!error stk_materncov_aniso(param); %!error stk_materncov_aniso(param, x); %!test stk_materncov_aniso(param, x, y); %!test stk_materncov_aniso(param, x, y, -1); %!test stk_materncov_aniso(param, x, y, -1, false); %!error stk_materncov_aniso(param, x, y, -1, false, pi^2); %!error stk_materncov_aniso(param, x, y, -2); %!test stk_materncov_aniso(param, x, y, -1); %!error stk_materncov_aniso(param, x, y, 0); %!test stk_materncov_aniso(param, x, y, 1); %!test stk_materncov_aniso(param, x, y, 2); %!test stk_materncov_aniso(param, x, y, 3); %!error stk_materncov_aniso(param, x, y, 4); %!error stk_materncov_aniso(param, x, y, nan); %!error stk_materncov_aniso(param, x, y, inf); %% % 3D, 4x10 %!shared dim, param, x, y, nx, ny %! dim = 3; %! param = log ([1.0; 1.5; 2.8; 2.7; 2.9]); %! nx = 4; ny = 10; %! x = stk_sampling_randunif(nx, dim); %! y = stk_sampling_randunif(ny, dim); %!test %! K1 = stk_materncov_aniso(param, x, y); %! K2 = stk_materncov_aniso(param, x, y, -1); %! assert(isequal(size(K1), [nx ny])); %! assert(stk_isequal_tolabs(K1, K2)); %!test %! for i = 1:(dim+2), %! dK = stk_materncov_aniso(param, x, y, i); %! assert(isequal(size(dK), [nx ny])); %! end %!test %! n = 7; %! x = stk_sampling_randunif(n, dim); %! y = stk_sampling_randunif(n, dim); %! %! K1 = stk_materncov_aniso(param, x, y); %! K2 = stk_materncov_aniso(param, x, y, -1, true); %! assert(isequal(size(K1), [n n])); %! assert(stk_isequal_tolabs(K2, diag(K1))); %! %! for i = 1:(dim+2), %! dK1 = stk_materncov_aniso(param, x, y, i); %! dK2 = stk_materncov_aniso(param, x, y, i, true); %! assert(isequal(size(dK1), [n n])); %! assert(stk_isequal_tolabs(dK2, diag(dK1))); %! end stk/inst/covfcs/stk_materncov_iso.m0000644000000000000000000001305613156161544014727 0ustar % STK_MATERNCOV_ISO computes the isotropic Matern covariance % % CALL: K = stk_materncov_iso (PARAM, X, Y) % % computes the covariance matrix K between the sets of locations X and Y, % using the isotropic Matern covariance kernel with parameters PARAM. The % output matrix K has size NX x NY, where NX is the number of rows in X % and NY the number of rows in Y. The vector of parameters must have % three elements: % % * PARAM(1) = log (SIGMA ^ 2), where SIGMA is the standard deviation, % % * PARAM(2) = log(NU), where NU is the regularity parameter, % % * PARAM(3) = - log (RHO), where RHO is the range parameter. % % CALL: dK = stk_materncov_iso (PARAM, X, Y, DIFF) % % computes the derivative of the covariance matrix with respect to % PARAM(DIFF) if DIFF~= -1, or the covariance matrix itself if DIFF is % equal to -1 (in which case this is equivalent to stk_materncov_iso % (PARAM, X, Y)). % % CALL: K = stk_materncov_iso (PARAM, X, Y, DIFF, PAIRWISE) % % computes the covariance vector (or a derivative of it if DIFF > 0) % between the sets of locations X and Y. The output K is a vector of % length N, where N is the common number of rows of X and Y. % Copyright Notice % % Copyright (C) 2015, 2016 CentraleSupelec % Copyright (C) 2011-2014 SUPELEC % % Authors: Julien Bect % Emmanuel Vazquez % Paul Feliot % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function k = stk_materncov_iso (param, x, y, diff, pairwise) if nargin > 5, stk_error ('Too many input arguments.', 'TooManyInputArgs'); end persistent x0 y0 param0 pairwise0 D % process input arguments x = double (x); y = double (y); if nargin < 4, diff = -1; end if nargin < 5, pairwise = false; end % extract parameters from the "param" vector Sigma2 = exp (param(1)); Nu = exp (param(2)); invRho = exp (param(3)); % check parameter values if ~ (Sigma2 > 0) || ~ (Nu > 0) || ~ (invRho >= 0), error ('Incorrect parameter value.'); end % check if all input arguments are the same as before % (or if this is the first call to the function) if isempty (x0) || isempty (y0) || isempty (param0) ... || ~ isequal ({x, y, param}, {x0, y0, param0}) ... || ~ isequal (pairwise, pairwise0) % compute the distance matrix D = invRho * stk_dist (x, y, pairwise); % save arguments for the nex call x0 = x; y0 = y; param0 = param; pairwise0 = pairwise; end if diff == -1, %%% compute the value (not a derivative) k = Sigma2 * stk_rbf_matern (Nu, D, -1); elseif diff == 1, %%% diff wrt param(1) = log(Sigma2) k = Sigma2 * stk_rbf_matern (Nu, D, -1); elseif diff == 2, %%% diff wrt param(2) = log(Nu) k = Nu * Sigma2 * stk_rbf_matern (Nu, D, 1); elseif diff == 3, %%% diff wrt param(3) = - log(invRho) k = D .* (Sigma2 * stk_rbf_matern (Nu, D, 2)); else error ('there must be something wrong here !'); end end % function %% % 1D, 5x5 %!shared param, x, y %! dim = 1; %! param = log ([1.0; 1.5; 2.9]); %! x = stk_sampling_randunif(5, dim); %! y = stk_sampling_randunif(5, dim); %!error stk_materncov_iso(); %!error stk_materncov_iso(param); %!error stk_materncov_iso(param, x); %!test stk_materncov_iso(param, x, y); %!test stk_materncov_iso(param, x, y, -1); %!test stk_materncov_iso(param, x, y, -1, false); %!error stk_materncov_iso(param, x, y, -1, false, pi^2); %!error stk_materncov_iso(param, x, y, -2); %!test stk_materncov_iso(param, x, y, -1); %!error stk_materncov_iso(param, x, y, 0); %!test stk_materncov_iso(param, x, y, 1); %!test stk_materncov_iso(param, x, y, 2); %!test stk_materncov_iso(param, x, y, 3); %!error stk_materncov_iso(param, x, y, 4); %!error stk_materncov_iso(param, x, y, nan); %!error stk_materncov_iso(param, x, y, inf); %% % 3D, 4x10 %!shared dim, param, x, y, nx, ny %! dim = 3; %! param = log ([1.0; 1.5; 2.9]); %! nx = 4; ny = 10; %! x = stk_sampling_randunif (nx, dim); %! y = stk_sampling_randunif (ny, dim); %!test %! K1 = stk_materncov_iso (param, x, y); %! K2 = stk_materncov_iso (param, x, y, -1); %! assert (isequal (size (K1), [nx ny])); %! assert (stk_isequal_tolabs (K1, K2)); %!test %! for i = 1:3, %! dK = stk_materncov_iso (param, x, y, i); %! assert (isequal (size (dK), [nx ny])); %! end %!test %! n = 7; %! x = stk_sampling_randunif(n, dim); %! y = stk_sampling_randunif(n, dim); %! %! K1 = stk_materncov_iso(param, x, y); %! K2 = stk_materncov_iso(param, x, y, -1, true); %! assert(isequal(size(K1), [n n])); %! assert(stk_isequal_tolabs(K2, diag(K1))); %! %! for i = 1:3, %! dK1 = stk_materncov_iso(param, x, y, i); %! dK2 = stk_materncov_iso(param, x, y, i, true); %! assert(isequal(size(dK1), [n n])); %! assert(stk_isequal_tolabs(dK2, diag(dK1))); %! end stk/inst/covfcs/stk_noisecov.m0000644000000000000000000000535313156161544013705 0ustar % STK_NOISECOV computes a noise covariance % Copyright Notice % % Copyright (C) 2011-2014 SUPELEC % % Authors: Julien Bect % Emmanuel Vazquez % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function K = stk_noisecov (ni, lognoisevariance, diff, pairwise) if nargin > 4, stk_error ('Too many input arguments.', 'TooManyInputArgs'); end if (nargin < 3) || (isempty (diff)), diff = -1; % default: compute the value (not a derivative) end if nargin < 4 pairwise = false; % default: matrix end if isscalar (lognoisevariance), % homoscedastic % Remark: the result does not depend on diff if pairwise if lognoisevariance == -inf K = zeros (ni, 1); else K = (exp (lognoisevariance)) * (ones (ni, 1)); end else if lognoisevariance == -inf K = zeros (ni); else K = (exp (lognoisevariance)) * (eye (ni)); end end else % heteroscedastic s = size (lognoisevariance); if ~ ((isequal (s, [1, ni])) || (isequal (s, [ni, 1]))) fprintf ('lognoisevariance has size:\n'); display (s); stk_error (sprintf (['lognoisevariance was expected to be either a ' ... 'scalar or a vector of length %d\n'], ni), 'IncorrectSize'); end if diff ~= -1, error ('diff ~= -1 is not allowed in the heteroscedastic case'); end if pairwise K = exp (lognoisevariance(:)); else K = diag (exp (lognoisevariance)); end end end % function %!shared ni, lognoisevariance, diff %! ni = 5; %! lognoisevariance = 0.0; %! diff = -1; %!error K = stk_noisecov(); %!error K = stk_noisecov(ni); %!test K = stk_noisecov(ni, lognoisevariance); %!test K = stk_noisecov(ni, lognoisevariance, diff); %!test K = stk_noisecov(ni, lognoisevariance, diff, true); %!error K = stk_noisecov(ni, lognoisevariance, diff, true, pi^2); stk/inst/covfcs/stk_sphcov_aniso.m0000644000000000000000000001524513156161544014554 0ustar % STK_SPHCOV_ANISO computes the anisotropic spherical covariance function % % CALL: K = stk_sphcov_aniso (PARAM, X, Y) % % computes the covariance matrix K between the sets of locations X and Y, % using the anisotropic spherical covariance kernel with parameters PARAM. % The output matrix K has size NX x NY, where NX is the number of rows in X % and NY the number of rows in Y. The vector of parameters must have DIM + 1 % elements, where DIM is the common number of columns of X and Y: % % * PARAM(1) = log (SIGMA ^ 2), where SIGMA is the standard deviation, % % * PARAM(1+i) = - log (RHO(i)), where RHO(i) is the range parameter % for the ith dimension. % % CALL: dK = stk_sphcov_aniso (PARAM, X, Y, DIFF) % % computes the derivative of the covariance matrix with respect to % PARAM(DIFF) if DIFF~= -1, or the covariance matrix itself if DIFF is % equal to -1 (in which case this is equivalent to stk_materncov_aniso % (PARAM, X, Y)). % % CALL: K = stk_sphcov_aniso (PARAM, X, Y, DIFF, PAIRWISE) % % computes the covariance vector (or a derivative of it if DIFF > 0) % between the sets of locations X and Y. The output K is a vector of % length N, where N is the common number of rows of X and Y. % Copyright Notice % % Copyright (C) 2015, 2016 CentraleSupelec % Copyright (C) 2011-2014 SUPELEC % % Authors: Julien Bect % Emmanuel Vazquez % Paul Feliot % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function k = stk_sphcov_aniso (param, x, y, diff, pairwise) if nargin > 5, stk_error ('Too many input arguments.', 'TooManyInputArgs'); end persistent x0 y0 xs ys param0 pairwise0 D Kx_cache compute_Kx_cache % process input arguments x = double (x); y = double (y); if nargin < 4, diff = -1; end if nargin < 5, pairwise = false; end % check consistency for the number of factors dim = size (x, 2); if (size (y, 2) ~= dim), stk_error ('xi and yi have incompatible sizes.', 'InvalidArgument'); end % check param nb_params = dim + 1; if (numel (param) ~= nb_params) stk_error ('xi and param have incompatible sizes.', 'InvalidArgument'); else param = reshape (param, 1, nb_params); % row vector end % extract parameters from the "param" vector Sigma2 = exp (param(1)); invRho = exp (param(2:end)); % check parameter values if ~ (Sigma2 > 0) || ~ all (invRho >= 0), error ('Incorrect parameter value.'); end % check if all input arguments are the same as before % (or if this is the first call to the function) if isempty (x0) || isempty (y0) || isempty (param0) ... || ~ isequal ({x, y, param}, {x0, y0, param0}) ... || ~ isequal (pairwise, pairwise0) % compute the distance matrix xs = bsxfun (@times, x, invRho); ys = bsxfun (@times, y, invRho); D = stk_dist (xs, ys, pairwise); % save arguments for the next call x0 = x; y0 = y; param0 = param; pairwise0 = pairwise; % recomputation of Kx_cache is required compute_Kx_cache = true; end if diff == -1, %%% compute the value (not a derivative) k = Sigma2 * stk_rbf_spherical (D, -1); elseif diff == 1, %%% diff wrt param(1) = log(Sigma2) k = Sigma2 * stk_rbf_spherical (D, -1); elseif (diff >= 2) && (diff <= nb_params), %%% diff wrt param(diff) = - log(invRho(diff-1)) ind = diff - 1; if compute_Kx_cache || isempty (Kx_cache) Kx_cache = 1 ./ (D + eps) .* (Sigma2 * stk_rbf_spherical (D, 1)); compute_Kx_cache = false; end if pairwise, k = (xs(:, ind) - ys(:, ind)).^2 .* Kx_cache; else k = (bsxfun (@minus, xs(:, ind), ys(:, ind)')) .^ 2 .* Kx_cache; end else stk_error ('Incorrect value for the ''diff'' parameter.', ... 'InvalidArgument'); end end % function %% % 1D, 5x5 %!shared param, x, y, K1, K2, K3 %! dim = 1; %! param = log ([1.0; 2.5]); %! x = stk_sampling_randunif (5, dim); %! y = stk_sampling_randunif (6, dim); %!error K0 = stk_sphcov_aniso (); %!error K0 = stk_sphcov_aniso (param); %!error K0 = stk_sphcov_aniso (param, x); %!test K1 = stk_sphcov_aniso (param, x, y); %!test K2 = stk_sphcov_aniso (param, x, y, -1); %!test K3 = stk_sphcov_aniso (param, x, y, -1, false); %!error K0 = stk_sphcov_aniso (param, x, y, -1, false, pi^2); %!assert (isequal (K1, K2)); %!assert (isequal (K1, K3)); %!test % df versus ordinary array %! u = double (x); v = double (y); %! K1 = stk_sphcov_aniso (param, u, v, -1); %! K2 = stk_sphcov_aniso (param, stk_dataframe (u), stk_dataframe (v), -1); %! assert (isequal (K1, K2)); %!error stk_sphcov_aniso (param, x, y, -2); %!test stk_sphcov_aniso (param, x, y, -1); %!error stk_sphcov_aniso (param, x, y, 0); %!test stk_sphcov_aniso (param, x, y, 1); %!test stk_sphcov_aniso (param, x, y, 2); %!error stk_sphcov_aniso (param, x, y, 3); %!error stk_sphcov_aniso (param, x, y, nan); %!error stk_sphcov_aniso (param, x, y, inf); %% % 3D, 4x10 %!shared dim, param, x, y, nx, ny %! dim = 3; %! param = log ([1.0; 2.5; 2.4; 2.6]); %! nx = 4; ny = 10; %! x = stk_sampling_randunif (nx, dim); %! y = stk_sampling_randunif (ny, dim); %!test %! K1 = stk_sphcov_aniso (param, x, y); %! K2 = stk_sphcov_aniso (param, x, y, -1); %! assert (isequal (size(K1), [nx ny])); %! assert (stk_isequal_tolabs (K1, K2)); %!test %! for i = 1:(dim + 1), %! dK = stk_sphcov_aniso (param, x, y, i); %! assert (isequal (size (dK), [nx ny])); %! end %!test %! n = 7; %! x = stk_sampling_randunif (n, dim); %! y = stk_sampling_randunif (n, dim); %! %! K1 = stk_sphcov_aniso (param, x, y); %! K2 = stk_sphcov_aniso (param, x, y, -1, true); %! assert (isequal (size (K1), [n n])); %! assert (stk_isequal_tolabs (K2, diag (K1))); %! %! for i = 1:(dim + 1), %! dK1 = stk_sphcov_aniso (param, x, y, i); %! dK2 = stk_sphcov_aniso (param, x, y, i, true); %! assert (isequal (size (dK1), [n n])); %! assert (stk_isequal_tolabs (dK2, diag (dK1))); %! end stk/inst/covfcs/stk_sphcov_iso.m0000644000000000000000000001240213156161544014225 0ustar % STK_SPHCOV_ISO computes the isotropic spherical covariance function % % CALL: K = stk_sphcov_iso (PARAM, X, Y) % % computes the covariance matrix K between the sets of locations X and % Y, using the isotropic spherical covariance function with parameters PARAM. % The output matrix K has size NX x NY, where NX is the number of rows in X % and NY the number of rows in Y. The vector of parameters must have two % elements: % % * PARAM(1) = log (SIGMA ^ 2), where SIGMA is the standard deviation, % % * PARAM(2) = - log (RHO), where RHO is the range parameter. % % CALL: dK = stk_sphcov_iso (PARAM, X, Y, DIFF) % % computes the derivative of the covariance matrix with respect to % PARAM(DIFF) if DIFF~= -1, or the covariance matrix itself if DIFF is % equal to -1 (in which case this is equivalent to stk_materncov_iso % (PARAM, X, Y)). % % CALL: K = stk_sphcov_iso (PARAM, X, Y, DIFF, PAIRWISE) % % computes the covariance vector (or a derivative of it if DIFF > 0) % between the sets of locations X and Y. The output K is a vector of % length N, where N is the common number of rows of X and Y. % Copyright Notice % % Copyright (C) 2016 CentraleSupelec % Copyright (C) 2011-2014 SUPELEC % % Authors: Julien Bect % Emmanuel Vazquez % Paul Feliot % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function k = stk_sphcov_iso (param, x, y, diff, pairwise) if nargin > 5, stk_error ('Too many input arguments.', 'TooManyInputArgs'); end persistent x0 y0 param0 pairwise0 D % process input arguments x = double (x); y = double (y); if nargin < 4, diff = -1; end if nargin < 5, pairwise = false; end % extract parameters from the "param" vector Sigma2 = exp (param(1)); invRho = exp (param(2)); % check parameter values if ~ (Sigma2 > 0) || ~ (invRho >= 0), error ('Incorrect parameter value.'); end % check if all input arguments are the same as before % (or if this is the first call to the function) if isempty (x0) || isempty (y0) || isempty (param0) ... || ~ isequal ({x, y, param}, {x0, y0, param0}) ... || ~ isequal (pairwise, pairwise0) % compute the distance matrix D = invRho * stk_dist (x, y, pairwise); % save arguments for the nex call x0 = x; y0 = y; param0 = param; pairwise0 = pairwise; end if diff == -1, %%% compute the value (not a derivative) k = Sigma2 * stk_rbf_spherical (D, -1); elseif diff == 1, %%% diff wrt param(1) = log(Sigma2) k = Sigma2 * stk_rbf_spherical (D, -1); elseif diff == 2, %%% diff wrt param(3) = - log(invRho) k = D .* (Sigma2 * stk_rbf_spherical (D, 1)); else error ('there must be something wrong here !'); end end % function %% % 1D, 5x5 %!shared param, x, y %! dim = 1; %! param = log ([1.0; 2.5]); %! x = stk_sampling_randunif (5, dim); %! y = stk_sampling_randunif (5, dim); %!error stk_sphcov_iso (); %!error stk_sphcov_iso (param); %!error stk_sphcov_iso (param, x); %!test stk_sphcov_iso (param, x, y); %!test stk_sphcov_iso (param, x, y, -1); %!test stk_sphcov_iso (param, x, y, -1, false); %!error stk_sphcov_iso (param, x, y, -1, false, pi^2); %!error stk_sphcov_iso (param, x, y, -2); %!test stk_sphcov_iso (param, x, y, -1); %!error stk_sphcov_iso (param, x, y, 0); %!test stk_sphcov_iso (param, x, y, 1); %!test stk_sphcov_iso (param, x, y, 2); %!error stk_sphcov_iso (param, x, y, 3); %!error stk_sphcov_iso (param, x, y, nan); %!error stk_sphcov_iso (param, x, y, inf); %% % 3D, 4x10 %!shared dim, param, x, y, nx, ny %! dim = 3; %! param = log ([1.0; 2.5]); %! nx = 4; ny = 10; %! x = stk_sampling_randunif (nx, dim); %! y = stk_sampling_randunif (ny, dim); %!test %! K1 = stk_sphcov_iso (param, x, y); %! K2 = stk_sphcov_iso (param, x, y, -1); %! assert (isequal (size (K1), [nx ny])); %! assert (stk_isequal_tolabs (K1, K2)); %!test %! for i = 1:2, %! dK = stk_sphcov_iso (param, x, y, i); %! assert (isequal (size (dK), [nx ny])); %! end %!test %! n = 7; %! x = stk_sampling_randunif (n, dim); %! y = stk_sampling_randunif (n, dim); %! %! K1 = stk_sphcov_iso (param, x, y); %! K2 = stk_sphcov_iso (param, x, y, -1, true); %! assert (isequal (size (K1), [n n])); %! assert (stk_isequal_tolabs (K2, diag (K1))); %! %! for i = 1:2, %! dK1 = stk_sphcov_iso (param, x, y, i); %! dK2 = stk_sphcov_iso (param, x, y, i, true); %! assert (isequal (size (dK1), [n n])); %! assert (stk_isequal_tolabs (dK2, diag (dK1))); %! end stk/inst/examples/0000755000000000000000000000000013156161544011346 5ustar stk/inst/examples/01_kriging_basics/0000755000000000000000000000000013156161544014624 5ustar stk/inst/examples/01_kriging_basics/stk_example_kb01.m0000644000000000000000000000705213156161544020137 0ustar % STK_EXAMPLE_KB01 Ordinary kriging in 1D, with noiseless data % % This example shows how to compute ordinary kriging predictions on a % one-dimensional noiseless dataset. % % The word 'ordinary' indicates that the mean function of the GP prior is % assumed to be constant and unknown. % % A Matern covariance function is used for the Gaussian Process (GP) prior. % The parameters of this covariance function are assumed to be known (i.e., % no parameter estimation is performed here). % % Note that the kriging predictor, which is the posterior mean of the GP, % interpolates the data in this noiseless example. % % See also: stk_example_kb01n, stk_example_kb02 % Copyright Notice % % Copyright (C) 2015, 2016 CentraleSupelec % Copyright (C) 2011-2014 SUPELEC % % Authors: Julien Bect % Emmanuel Vazquez % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . stk_disp_examplewelcome %% Dataset % Load a 1D noiseless dataset [xi, zi, ref] = stk_dataset_twobumps ('noiseless'); % The grid where predictions must be made xt = ref.xt; % Reference values on the grid zt = ref.zt; stk_figure ('stk_example_kb01 (a)'); stk_plot1d (xi, zi, xt, zt); legend show; stk_title ('True function and observed data'); stk_labels ('input variable x', 'response z'); %% Specification of the model % % We choose a Matern covariance with "fixed parameters" (in other words, the % parameters of the covariance function are provided by the user rather than % estimated from data). % % The following line defines a model with a constant but unknown mean (ordinary % kriging) and a Matern covariance function. (Some default parameters are also % set, but we override them below.) model = stk_model ('stk_materncov_iso'); % NOTE: the suffix '_iso' indicates an ISOTROPIC covariance function, but the % distinction isotropic / anisotropic is irrelevant here since DIM = 1. % Parameters for the Matern covariance function % ("help stk_materncov_iso" for more information) SIGMA2 = 0.5; % variance parameter NU = 4.0; % regularity parameter RHO1 = 0.4; % scale (range) parameter model.param = log ([SIGMA2; NU; 1/RHO1]); model %% Carry out the kriging prediction and display the result % % The result of a kriging predicition is provided by stk_predict() in an object % zp of type stk_dataframe, with two columns: "zp.mean" (the kriging mean) and % "zp.var" (the kriging variance). % % Carry out the kriging prediction at points xt zp = stk_predict (model, xi, zi, xt); % Display the result stk_figure ('stk_example_kb01 (b)'); stk_plot1d (xi, zi, xt, zt, zp); legend show; stk_title ('Kriging prediction based on noiseless observations'); stk_labels ('input variable x', 'response z'); %#ok<*NOPTS> %!test stk_example_kb01; close all; stk/inst/examples/01_kriging_basics/stk_example_kb01n.m0000644000000000000000000000707413156161544020321 0ustar % STK_EXAMPLE_KB01N Ordinary kriging in 1D, with noisy data % % This example shows how to compute ordinary kriging predictions on a % one-dimensional noisy dataset. % % The Gaussian Process (GP) prior is the same as in stk_example_kb01. % % The observation noise is Gaussian and homoscedastic (constant variance). % Its variance is assumed to be known. % % Note that the kriging predictor, which is the posterior mean of the GP, % does NOT interpolate the data in this noisy example. % % See also: stk_example_kb01, stk_example_kb02n % Copyright Notice % % Copyright (C) 2015, 2016 CentraleSupelec % Copyright (C) 2011-2014 SUPELEC % % Authors: Julien Bect % Emmanuel Vazquez % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . stk_disp_examplewelcome %% Dataset % Load a 1D noisy dataset (homoscedastic Gaussian noise) [xi, zi, ref] = stk_dataset_twobumps ('noisy1'); % The grid where predictions must be made xt = ref.xt; % Reference values on the grid zt = ref.zt; stk_figure ('stk_example_kb01n (a)'); stk_plot1d (xi, zi, xt, zt); legend show; stk_title ('True function and observed data'); stk_labels ('input variable x', 'response z'); %% Specification of the model % % We choose a Matern covariance with "fixed parameters" (in other words, the % parameters of the covariance function are provided by the user rather than % estimated from data). % % The following line defines a model with a constant but unknown mean (ordinary % kriging) and a Matern covariance function. (Some default parameters are also % set, but we override them below.) model = stk_model ('stk_materncov_iso'); % NOTE: the suffix '_iso' indicates an ISOTROPIC covariance function, but the % distinction isotropic / anisotropic is irrelevant here since DIM = 1. % Parameters for the Matern covariance function % ("help stk_materncov_iso" for more information) SIGMA2 = 0.5; % variance parameter NU = 4.0; % regularity parameter RHO1 = 0.4; % scale (range) parameter model.param = log ([SIGMA2; NU; 1/RHO1]); % It is assumed in this example that the variance of the noise is known model.lognoisevariance = 2 * log (ref.noise_std); model %% Carry out the kriging prediction and display the result % % The result of a kriging predicition is provided by stk_predict() in an object % zp of type stk_dataframe, with two columns: "zp.mean" (the kriging mean) and % "zp.var" (the kriging variance). % % Carry out the kriging prediction at points xt zp = stk_predict (model, xi, zi, xt); % Display the result stk_figure ('stk_example_kb01n (b)'); stk_plot1d (xi, zi, xt, zt, zp); legend show; stk_title ('Kriging prediction based on noisy observations'); stk_labels ('input variable x', 'response z'); %#ok<*NOPTS> %!test stk_example_kb01n; close all; stk/inst/examples/01_kriging_basics/stk_example_kb02.m0000644000000000000000000000526713156161544020146 0ustar % STK_EXAMPLE_KB02 Ordinary kriging in 1D with parameter estimation % % This example shows how to estimate covariance parameters and compute % ordinary kriging predictions on a one-dimensional noiseless dataset. % % The model and data are the same as in stk_example_kb01, but this time the % parameters of the covariance function are estimated using the Restricted % Maximum Likelihood (ReML) method. % % See also: stk_example_kb01, stk_example_kb02n % Copyright Notice % % Copyright (C) 2015, 2016 CentraleSupelec % Copyright (C) 2011-2014 SUPELEC % % Authors: Julien Bect % Emmanuel Vazquez % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . stk_disp_examplewelcome %% Dataset % Load a 1D noiseless dataset [xi, zi, ref] = stk_dataset_twobumps ('noiseless'); % The grid where predictions must be made xt = ref.xt; % Reference values on the grid zt = ref.zt; stk_figure ('stk_example_kb02 (a)'); stk_plot1d (xi, zi, xt, zt); legend show; stk_title ('True function and observed data'); %% Specification of the model % Define a model with a constant but unknown mean (ordinary kriging) % and a Matern covariance function, the parameters of which will be % estimated from the data. model = stk_model ('stk_materncov_iso'); %% Parameter estimation % Here, the parameters of the Matern covariance function are estimated % by the REML (REstricted Maximum Likelihood) method. model.param = stk_param_estim (model, xi, zi); model %% Carry out the kriging prediction and display the result % Compute the kriging predictor (and the kriging variance) on the grid zp = stk_predict (model, xi, zi, xt); stk_figure ('stk_example_kb02 (b)'); stk_plot1d (xi, zi, xt, zt, zp); legend show; stk_title ('Kriging prediction with estimated parameters'); stk_labels ('input variable x', 'response z'); %#ok<*NOPTS> %!test stk_example_kb02; close all; stk/inst/examples/01_kriging_basics/stk_example_kb02n.m0000644000000000000000000000577713156161544020332 0ustar % STK_EXAMPLE_KB02N Noisy ordinary kriging in 1D with parameter estimation % % This example shows how to estimate covariance parameters and compute % ordinary kriging predictions on a one-dimensional noisy dataset. % % The model and data are the same as in stk_example_kb02, but this time the % parameters of the covariance function and the variance of the noise are % jointly estimated using the Restricted Maximum Likelihood (ReML) method. % % See also: stk_example_kb01n, stk_example_kb02 % Copyright Notice % % Copyright (C) 2015, 2016 CentraleSupelec % Copyright (C) 2011-2014 SUPELEC % % Authors: Julien Bect % Emmanuel Vazquez % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . stk_disp_examplewelcome %% Dataset % Load a 1D noisy dataset (homoscedastic Gaussian noise) [xi, zi, ref] = stk_dataset_twobumps ('noisy1'); % The grid where predictions must be made xt = ref.xt; % Reference values on the grid zt = ref.zt; stk_figure ('stk_example_kb02n (a)'); stk_plot1d (xi, zi, xt, zt); legend show; stk_title ('True function and noisy observed data'); %% Specification of the model % Define a model with a constant but unknown mean (ordinary kriging) % and a Matern covariance function, the parameters of which will be % estimated from the data. model = stk_model ('stk_materncov_iso'); % Indicate that with the noise variance to be estimated model.lognoisevariance = nan; %% Parameter estimation % Here, the parameters of the Matern covariance function are estimated % by the REML (REstricted Maximum Likelihood) method. [model.param, model.lognoisevariance] = stk_param_estim (model, xi, zi); model fprintf ('True noise variance = %.4f\n', ref.noise_std ^ 2); fprintf ('Estimated noise variance = %.4f\n\n', exp (model.lognoisevariance)); %% Carry out the kriging prediction and display the result % Compute the kriging predictor (and the kriging variance) on the grid zp = stk_predict (model, xi, zi, xt); stk_figure ('stk_example_kb02n (b)'); stk_plot1d (xi, zi, xt, zt, zp); legend show; stk_title ('Kriging prediction with estimated parameters'); stk_labels ('input variable x', 'response z'); %#ok<*NOPTS> %!test stk_example_kb02n; close all; stk/inst/examples/01_kriging_basics/stk_example_kb03.m0000644000000000000000000001211713156161544020137 0ustar % STK_EXAMPLE_KB03 Ordinary kriging in 2D % % An anisotropic Matern covariance function is used for the Gaussian Process % (GP) prior. The parameters of this covariance function (variance, regularity % and ranges) are estimated using the Restricted Maximum Likelihood (ReML) % method. % % The mean function of the GP prior is assumed to be constant and unknown. This % default choice can be overridden by means of the model.lm property. % % The function is sampled on a space-filling Latin Hypercube design, and the % data is assumed to be noiseless. % Copyright Notice % % Copyright 2016 CentraleSupelec % Copyright (C) 2011-2014 SUPELEC % % Authors: Julien Bect % Emmanuel Vazquez % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . stk_disp_examplewelcome; stk_figure ('stk_example_kb03'); CONTOUR_LINES = 40; % number of levels in contour plots DOT_STYLE = {'ro', 'MarkerFaceColor', 'r', 'MarkerSize', 4}; %% CHOICE OF A TWO-DIMENSIONAL TEST FUNCTION CASENUM = 1; switch CASENUM case 1, % the classical BRANIN-HOO test function f = @stk_testfun_braninhoo; DIM = 2; BOX = [[-5; 10], [0; 15]]; NI = 20; case 2, % another test function f_ = inline (['exp(1.8*(x1+x2)) + 3*x1 + 6*x2.^2' ... '+ 3*sin(4*pi*x1)'], 'x1', 'x2'); f = @(x)(f_(x(:, 1), x(:, 2))); DIM = 2; BOX = [[-1; 1], [-1; 1]]; NI = 40; % this second function is much harder to approximate end % Optional: create an hyper-rectangle object for the input space BOX = stk_hrect (BOX, {'x_1', 'x_2'}) %% COMPUTE AND VISUALIZE THE FUNCTION ON A 80 x 80 REGULAR GRID % Size of the regular grid NT = 80 ^ DIM; % The function stk_sampling_regulargrid() does the job of creating the grid xt = stk_sampling_regulargrid (NT, DIM, BOX); % Compute the corresponding responses zt = stk_feval (f, xt); % Since xt is a regular grid, we can do a contour plot stk_subplot (2, 2, 1); contour (xt, f, CONTOUR_LINES); axis (BOX); stk_title ('function to be approximated'); %% CHOOSE A KRIGING (GAUSSIAN PROCESS) MODEL % We start with a generic (anisotropic) Matern covariance function. model = stk_model ('stk_materncov_aniso', DIM); % As a default choice, a constant (but unknown) mean is used, % i.e., model.lm = stk_lm_constant. % model.lm = stk_lm_affine; %%% UNCOMMENT TO USE A LINEAR TREND % model.lm = stk_lm_quadratic; %%% UNCOMMENT TO USE A "FULL QUADRATIC" TREND %% EVALUATE THE FUNCTION ON A "MAXIMIN LHS" DESIGN xi = stk_sampling_maximinlhs (NI, DIM, BOX); zi = stk_feval (f, xi); % Add the design points to the first plot hold on; plot (xi(:, 1), xi(:, 2), DOT_STYLE{:}); %% ESTIMATE THE PARAMETERS OF THE COVARIANCE FUNCTION % Compute an initial guess for the parameters of the Matern covariance (param0) % and a reasonable log-variance for a small "regularization noise" [param0, model.lognoisevariance] = stk_param_init (model, xi, zi, BOX); % % Alternative: user-defined initial guess for the parameters of % % the Matern covariance (see "help stk_materncov_aniso" for more information) % SIGMA2 = var (zi); % NU = 2; % RHO1 = (BOX(2,1) - BOX(1,1)) / 10; % RHO2 = (BOX(2,2) - BOX(1,2)) / 10; % param0 = log ([SIGMA2; NU; 1/RHO1; 1/RHO2]); % model.lognoisevariance = 2 * log (1e-5); model.param = stk_param_estim (model, xi, zi, param0); %% CARRY OUT KRIGING PREDICITION AND VISUALIZE % Here, we compute the kriging prediction on each point of the grid zp = stk_predict (model, xi, zi, xt); % Display the result using a contour plot, to be compared with the contour % lines of the true function stk_subplot (2, 2, 2); contour (xt, zp.mean, CONTOUR_LINES); tsc = sprintf ('approximation from %d points', NI); hold on; plot (xi(:, 1), xi(:, 2), DOT_STYLE{:}); hold off; axis (BOX(:)); stk_title (tsc); %% VISUALIZE THE ACTUAL PREDICTION ERROR AND THE KRIGING STANDARD DEVIATION stk_subplot (2, 2, 3); pcolor (xt, log (abs (zp.mean - zt))); hold on; plot (xi(:, 1), xi(:, 2), DOT_STYLE{:}); hold off; axis (BOX(:)); stk_title ('true approx error (log)'); stk_subplot (2, 2, 4); pcolor (xt, 0.5 * log (zp.var)); hold on; plot (xi(:, 1), xi(:, 2), DOT_STYLE{:}); hold off; axis (BOX(:)); stk_title ('kriging std (log)'); %#ok<*NOPTS> %!test stk_example_kb03; close all; stk/inst/examples/01_kriging_basics/stk_example_kb04.m0000644000000000000000000000221313156161544020134 0ustar % STK_EXAMPLE_KB04 Estimating the variance of the noise % % This example no longer exists. See stk_example_kb02n instead. % % See also: stk_example_kb01n, stk_example_kb02n % Copyright Notice % % Copyright (C) 2016 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . stk_disp_examplewelcome (); stk/inst/examples/01_kriging_basics/stk_example_kb05.m0000644000000000000000000001031713156161544020141 0ustar % STK_EXAMPLE_KB05 Generation of conditioned sample paths % % A Matern Gaussian process model is used, with constant but unknown mean % (ordinary kriging) and known covariance parameters. % % Given noiseless observations from the unknown function, a batch of conditioned % sample paths is drawn using the "conditioning by kriging" technique. In short, % this means that unconditioned sample path are simulated first (using % stk_generate_samplepaths), and then conditioned on the observations by kriging % (using stk_conditioning). % % Note: in this example, for pedagogical purposes, conditioned samplepaths are % simulated in two steps: first, unconditioned samplepaths are simulated; % second, conditioned samplepaths are obtained using conditioning by kriging. % In practice, these two steps can be carried out all at once using % stk_generate_samplepath (see, e.g., stk_example_kb09). % % See also: stk_generate_samplepaths, stk_conditioning, stk_example_kb09 % Copyright Notice % % Copyright (C) 2016 CentraleSupelec % Copyright (C) 2011-2014 SUPELEC % % Authors: Julien Bect % Emmanuel Vazquez % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . stk_disp_examplewelcome; stk_figure ('stk_example_kb05'); %% Dataset % Load a 1D noiseless dataset [xi, zi, ref] = stk_dataset_twobumps ('noiseless'); % The grid where predictions must be made xt = ref.xt; % Reference values on the grid zt = ref.zt; % Indices of the evaluation points xi in the grid xi_ind = ref.xi_ind; %% Specification of the model % % We choose a Matern covariance with "fixed parameters" (in other % words, the parameters of the covariance function are provided by the user % rather than estimated from data). % % The following line defines a model with a constant but unknown mean % (ordinary kriging) and a Matern covariance function. (Some default % parameters are also set, but we override them below.) model = stk_model ('stk_materncov_iso'); % Parameters for the Matern covariance % ("help stk_materncov_iso" for more information) SIGMA2 = 1.0; % variance parameter NU = 4.0; % regularity parameter RHO1 = 0.4; % scale (range) parameter model.param = log ([SIGMA2; NU; 1/RHO1]); %% Generate (unconditional) sample paths NB_PATHS = 10; zsim = stk_generate_samplepaths (model, xt, NB_PATHS); % Display the result stk_subplot (2, 2, 1); plot (xt, zsim, 'LineWidth', 2); legend off; stk_title ('Unconditional sample paths'); stk_labels ('input variable x', 'response z'); %% Carry out the kriging prediction and generate conditional sample paths % Carry out the kriging prediction at points xt [zp, lambda] = stk_predict (model, xi, zi, xt); % Condition sample paths on the observations zsimc = stk_conditioning (lambda, zi, zsim, xi_ind); % Display the observations only stk_subplot (2, 2, 2); stk_plot1d (xi, zi); stk_title ('Observations'); stk_labels ('input variable x', 'response z'); % Display the conditional sample paths stk_subplot (2, 2, 3); plot (xt, zsimc, 'LineWidth', 2); legend off; hold on; plot (xi, zi, 'ko', 'MarkerSize', 6, 'MarkerFaceColor', 'k'); stk_title ('Conditional sample paths'); stk_labels ('input variable x', 'response z'); % Display the kriging and credible intervals stk_subplot (2, 2, 4); stk_plot1d (xi, zi, xt, zt, zp, zsimc); stk_title ('Prediction and credible intervals'); stk_labels ('input variable x', 'response z'); %!test stk_example_kb05; close all; stk/inst/examples/01_kriging_basics/stk_example_kb06.m0000644000000000000000000000645513156161544020152 0ustar % STK_EXAMPLE_KB06 Ordinary kriging VS kriging with a linear trend % % The same dataset is analyzed using two variants of kriging. % % The left panel shows the result of ordinary kriging, in other words, Gaussian % process interpolation assuming a constant (but unknown) mean. The right panel % shows the result of adding a linear trend in the mean of the Gaussian process. % % The difference with the left plot is clear in extrapolation: the first predic- % tor exhibits a "mean reverting" behaviour, while the second one captures an % increasing trend in the data. % Copyright Notice % % Copyright (C) 2016 CantraleSupelec % Copyright (C) 2011-2014 SUPELEC % % Authors: Julien Bect % Emmanuel Vazquez % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . stk_disp_examplewelcome; stk_figure ('stk_example_kb06'); %% Preliminaries DIM = 1; % Dimension of the factor space BOX = [-2.0; 2.0]; % Factor space NT = 1e3; % Number of points in the grid xt = stk_sampling_regulargrid (NT, DIM, BOX); % Construct a regular grid %% Data xi = stk_dataframe ([0.00; 0.10; 0.20], {'x'}); % Evaluation points zi = stk_dataframe ([0.00; 0.09; 0.21], {'z'}); % Evaluation results %% Default parameters for the Matern covariance % Parameters used as initial values for stk_param_estim() SIGMA2 = 1.0; % variance parameter NU = 2.0; % regularity parameter RHO1 = 0.4; % scale (range) parameter param0 = log ([SIGMA2; NU; 1/RHO1]); %% Ordinary kriging (constant mean) model = stk_model ('stk_materncov_iso', DIM); model.lognoisevariance = 2 * log (1e-10); % model.lm = stk_lm_constant is the default % Estimate the parameters of the covariance model.param = stk_param_estim (model, xi, zi, param0); % Carry out kriging prediction zp = stk_predict (model, xi, zi, xt); % Plot the result stk_subplot (1, 2, 1); stk_plot1d (xi, zi, xt, [], zp); stk_title ('Ordinary kriging'); ylim ([-5 5]); %% Linear trend (aka "universal kriging") % We just need to change the value of 'order' in the model model.lm = stk_lm_affine; % Re-estimate the parameters of the covariance model.param = stk_param_estim (model, xi, zi, param0); % Carry out kriging prediction zp = stk_predict (model, xi, zi, xt); % Plot the result stk_subplot (1, 2, 2); stk_plot1d (xi, zi, xt, [], zp); stk_title ('Kriging with linear trend'); ylim ([-5 5]); %!test stk_example_kb06; close all; stk/inst/examples/01_kriging_basics/stk_example_kb07.m0000644000000000000000000000366413156161544020152 0ustar % STK_EXAMPLE_KB07 Simulation of sample paths from a Matern process % Copyright Notice % % Copyright (C) 2013, 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . stk_disp_examplewelcome; stk_figure ('stk_example_kb07'); %% Define the factor space & a Matern GP model on it % Factor space DIM = 1; BOX = [-1.0; 1.0]; % Grid N = 400; x = stk_sampling_regulargrid (N, DIM, BOX); % Model model = stk_model ('stk_materncov_iso'); SIGMA2 = 1.0; % variance parameter NU = NaN; % regularity parameter RHO1 = 0.4; % scale (range) parameter model.param = log ([SIGMA2; NU; 1/RHO1]); % Several values for nu nu_list = [0.5 1.5 2.5 10.0]; %% Generate (unconditional) sample paths NB_PATHS = 10; for k = 1:4, model.param(2) = log (nu_list(k)); zsim = stk_generate_samplepaths (model, x, NB_PATHS); % Display the result stk_subplot (2, 2, k); plot (x, zsim, 'LineWidth', 2); legend off; stk_title (sprintf ('Matern, nu = %.1f', nu_list(k))); stk_labels ('input variable x', 'response z', 'FontWeight', 'bold'); end %!test stk_example_kb07; close all; stk/inst/examples/01_kriging_basics/stk_example_kb08.m0000644000000000000000000000573713156161544020156 0ustar % STK_EXAMPLE_KB08 Generation of conditioned sample paths made easy % % It has been demonstrated, in stk_example_kb05, how to generate conditioned % sample paths using unconditioned sample paths and conditioning by kriging. % % This example shows how to do the same in a more concise way, letting STK % take care of the details. % Copyright Notice % % Copyright (C) 2016 CentraleSupelec % Copyright (C) 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . stk_disp_examplewelcome; stk_figure ('stk_example_kb08'); NB_PATHS = 10; % number of sample paths that we want to produce %% Dataset % Load a 1D noiseless dataset [xi, zi, ref] = stk_dataset_twobumps ('noiseless'); % The grid where predictions must be made xt = ref.xt; % Reference values on the grid zt = ref.zt; % Indices of the evaluation points xi in the grid xi_ind = ref.xi_ind; %% Specification of the model model = stk_model ('stk_materncov_iso'); % Parameters for the Matern covariance % ("help stk_materncov_iso" for more information) SIGMA2 = 1.0; % variance parameter NU = 4.0; % regularity parameter RHO1 = 0.4; % scale (range) parameter model.param = log ([SIGMA2; NU; 1/RHO1]); %% Method 1: explicit conditioning by kriging (as in stk_example_kb05) zsim = stk_generate_samplepaths (model, xt, NB_PATHS); % Carry out the kriging prediction at points xt [zp, lambda] = stk_predict (model, xi, zi, xt); % Condition sample paths on the observations zsimc1 = stk_conditioning (lambda, zi, zsim, xi_ind); %% Method 2: let STK take care of the details zsimc2 = stk_generate_samplepaths (model, xi, zi, xt, NB_PATHS); %% Figure stk_subplot (1, 2, 1); plot (xt, zsimc1, 'LineWidth', 2); legend off; hold on; plot (xi, zi, 'ko', 'MarkerSize', 6, 'MarkerFaceColor', 'k'); stk_title (sprintf ('%d conditional sample paths', NB_PATHS)); stk_labels ('input variable x', 'response z'); stk_subplot (1, 2, 2); plot (xt, zsimc2, 'LineWidth', 2); legend off; hold on; plot (xi, zi, 'ko', 'MarkerSize', 6, 'MarkerFaceColor', 'k'); stk_title (sprintf ('another set of %d sample paths', NB_PATHS)); stk_labels ('input variable x', 'response z'); %!test stk_example_kb08; close all; stk/inst/examples/01_kriging_basics/stk_example_kb09.m0000644000000000000000000000603013156161544020142 0ustar % STK_EXAMPLE_KB09 Generation of sample paths conditioned on noisy observations % % A Matern Gaussian process model is used, with constant but unknown mean % (ordinary kriging) and known covariance parameters. % % Given noisy observations from the unknown function, a batch of conditioned % sample paths is drawn using the "conditioning by kriging" technique % (stk_generate_samplepaths function). % % See also: stk_generate_samplepaths, stk_conditioning, stk_example_kb05 % Copyright Notice % % Copyright (C) 2015, 2016 CentraleSupelec % Copyright (C) 2011-2014 SUPELEC % % Authors: Julien Bect % Emmanuel Vazquez % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . stk_disp_examplewelcome; stk_figure ('stk_example_kb09'); %% Dataset % Load a 1D noisy dataset (heteroscedastic Gaussian noise) [xi, zi, ref] = stk_dataset_twobumps ('noisy2'); % The grid where predictions must be made xt = ref.xt; % Reference values on the grid zt = ref.zt; %% Gaussian process model % Define a model with a constant but unknown mean (ordinary kriging) % and a Matern 5/2 covariance function, the parameters of which will be % estimated from the data. model = stk_model ('stk_materncov52_iso'); % Variance of the heteroscedastic noise (assumed to be known). % Note that ref.noise_std is a *vector* in this case. model.lognoisevariance = 2 * log (ref.noise_std); % ReML parameter estimation model.param = stk_param_estim (model, xi, zi); %% Generate conditional sample paths NB_PATHS = 20; zp = stk_predict (model, xi, zi, xt); z_sim_cond = stk_generate_samplepaths (model, xi, zi, xt, NB_PATHS); % Display the result stk_plot1d (xi, zi, xt, zt, zp, z_sim_cond); try % Catch Octave 4.0.x bug (see https://sourceforge.net/p/kriging/tickets/55) h = legend ('show'); set (h, 'Location', 'NorthWest'); catch end; stk_title ('Prediction and credible intervals'); stk_labels ('input variable x', 'response z'); % These tests are disabled in the Octave package release % (see Octave bug #46350, https://savannah.gnu.org/bugs/?46350) % !test HOMOSCEDASTIC_NOISE = true; stk_example_kb09; close all; % !test HOMOSCEDASTIC_NOISE = false; stk_example_kb09; close all; %!test stk_example_kb09; close all; stk/inst/examples/01_kriging_basics/stk_example_kb10.m0000644000000000000000000000546013156161544020140 0ustar % STK_EXAMPLE_KB10 Leave-one-out (LOO) cross validation % % This example demonstrate the use of Leave-one-out (LOO) cross-validation to % produced goodness-of-fit graphical diagnostics. % % The dataset comes from the "borehole model" response function, evaluated % without noise on a space-filling design of size 10 * DIM = 80. It is analyzed % using a Gaussian process prior with unknown constant mean (with a uniform % prior) and anisotropic stationary Matern covariance function (regularity 5/2; % variance and range parameters estimated by restricted maximum likelihood). % % See also stk_predict_leaveoneout, stk_plot_predvsobs, stk_plot_histnormres % Copyright Notice % % Copyright (C) 2016 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . stk_disp_examplewelcome (); % Define the input domain (see stk_testfun_borehole.m) BOX = stk_hrect ([ ... 0.05 100 63070 990 63.1 700 1120 9855; ... 0.15 50000 115600 1110 116 820 1680 12045], ... {'rw', 'r', 'Tu', 'Hu', 'Tl', 'Hl', 'L', 'Kw'}); % Generate dataset d = size (BOX, 2); x = stk_sampling_maximinlhs (10 * d, d, BOX); % Space-filling LHS of size 10*d y = stk_testfun_borehole (x); % Obtain the responses on the DoE x % Build Gaussian process model M_prior = stk_model (@stk_materncov52_aniso, d); % prior M_prior.param = stk_param_estim (M_prior, x, y); % ReML parameter estimation % Compye LOO predictions and residuals [y_LOO, res_LOO] = stk_predict_leaveoneout (M_prior, x, y); % Plot predictions VS observations (left planel) % and normalized residuals (right panel) stk_figure ('stk_example_kb10 (a)'); stk_plot_predvsobs (y, y_LOO); stk_figure ('stk_example_kb10 (b)'); stk_plot_histnormres (res_LOO.norm_res); % Note that the three previous lines can be summarized, % if you only need the two diagnostic plots, as: % % stk_predict_leaveoneout (M_prior, x, y); % % (calling stk_predict_leaveoneout with no output arguments creates the plots). stk/inst/examples/02_design_of_experiments/0000755000000000000000000000000013156161544016227 5ustar stk/inst/examples/02_design_of_experiments/stk_example_doe01.m0000644000000000000000000000475413156161544021723 0ustar % STK_EXAMPLE_DOE01 Examples of two-dimensional designs % % All designs are constructed on the hyper-rectangle BOX = [0; 2] x [0; 4]. % % Examples of the following designs are shown: % a) Regular grid --> stk_sampling_regulargrid, % b) "Maximin" latin hypercube sample --> stk_sampling_maximinlhs, % c) RR2-scrambled Halton sequence --> stk_sampling_halton_rr2, % d) Uniformly distributed random sample --> stk_sampling_randunif. % Copyright Notice % % Copyright (C) 2011-2014 SUPELEC % % Authors: Julien Bect % Emmanuel Vazquez % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . stk_disp_examplewelcome DIM = 2; % dimension of the factor space BOX = [0 0; 2 4]; % factor space N = 49; % size of the space-filling designs stk_figure (sprintf ('stk_exampke_doe01 - Several designs with N = %d', N)); PLOT_OPTIONS = {'ko', 'MarkerSize', 4, 'MarkerFaceColor', 'k'}; %% Regular grid x = stk_sampling_regulargrid (N, DIM, BOX); stk_subplot (2, 2, 1); plot (x(:, 1), x(:, 2), PLOT_OPTIONS{:}); stk_title ('a) Regular grid'); %% "Maximin" Latin Hypercube samples x = stk_sampling_maximinlhs (N, DIM, BOX); stk_subplot (2, 2, 2); plot (x(:, 1), x(:, 2), PLOT_OPTIONS{:}); stk_title ('b) "Maximin" LHS'); %% Halton sequence with RR2 scrambling x = stk_sampling_halton_rr2 (N, DIM, BOX); stk_subplot (2, 2, 3); plot (x(:, 1), x(:, 2), PLOT_OPTIONS{:}); stk_title ('c) Halton-RR2'); %% Random (uniform) sampling x = stk_sampling_randunif (N, DIM, BOX); stk_subplot (2, 2, 4); plot (x(:, 1), x(:, 2), PLOT_OPTIONS{:}); stk_title ('d) Random'); %!test stk_example_doe01; close all; stk/inst/examples/02_design_of_experiments/stk_example_doe02.m0000644000000000000000000000546513156161544021724 0ustar % STK_EXAMPLE_DOE02 "Sequential Maximin" design % % In this example, a two-dimensional space-filling design is progressively % enriched with new points using a "sequential maximin" approach. More % precisely, the k-th point X(k, :) is selected to maximize the distance to the % set of all previously selected points X(1, :), X(2, :), ..., X(k-1, :). % % NOTES: % % * The resulting design is NOT optimal with respect to the maximin criterion % (separation distance). % % * This procedure is not truly a *sequential* design procedure, since the % choice of the k-th point X(k, :) does NOT depend on the response at the % previously selected locations X(i, :), i < k. % % REFERENCE % % [1] Emmanuel Vazquez and Julien Bect, "Sequential search based on kriging: % convergence analysis of some algorithms", In: ISI - 58th World % Statistics Congress of the International Statistical Institute (ISI'11), % Dublin, Ireland, August 21-26, 2011. % Copyright Notice % % Copyright (C) 2013, 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . stk_disp_examplewelcome; stk_figure ('stk_example_doe02'); %% Preliminaries DIM = 2; BOX = repmat ([0; 1], 1, DIM); % start from, e. g., a random/maximin LHS N0 = 10; x = stk_sampling_maximinlhs (N0, DIM, BOX); % final size of the desired DoE NB_ITER = 10; % plot styles STYLE_CURRENT = {'bo', 'MarkerFaceColor', 0.7 * ones(1, 3)}; STYLE_NEXT = {'ro', 'MarkerFaceColor', 'y'}; %% Sequential design % % This section can be run several times, to produce a bigger DoE ! % for i = 1:NB_ITER, % compute the current fill distance % & the point where the maximum is attained [fd, next_x] = stk_filldist (x, BOX); % plot cla; plot (x(:, 1), x(:, 2), STYLE_CURRENT{:}); hold on; plot (next_x(:, 1), next_x(:, 2), STYLE_NEXT{:}); stk_title (sprintf ('n = %d, fd = %.2e\n', size (x, 1), fd)); drawnow; pause (0.5); % enrich the DoE x = vertcat (x, next_x); end %!test stk_example_doe02; close all; stk/inst/examples/02_design_of_experiments/stk_example_doe03.m0000644000000000000000000001272513156161544021722 0ustar % STK_EXAMPLE_DOE03 A simple illustration of 1D Bayesian optimization % % Our goal here is to optimize (maximize) the one-dimensional function % % x |--> x * sin (x) % % over the interval [0; 4 * pi]. % % A Matern 5/2 prior with known parameters is used. % % Evaluations points are chosen sequentially using the Expected Improvement (EI) % criterion, starting from an initial design of N0 = 3 points. % Copyright Notice % % Copyright (C) 2015, 2017 CentraleSupelec % Copyright (C) 2013, 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . stk_disp_examplewelcome; stk_figure ('stk_example_doe03'); %% Problem definition % % Here we define a one-dimensional maximization problem. % % The goal is to find the maximum of f on the domain BOX. % % 1D test function f = @(x)(x .* sin (x)); % Define a 1D test function DIM = 1; % Dimension of the factor space BOX = stk_hrect ([0; 12], {'x'}); % Factor space (hyper-rectangle object) % Space discretization NT = 400; % Number of points in the grid xg = stk_sampling_regulargrid (NT, DIM, BOX); % Give names explicit names to the points of the grid xg.rownames = arrayfun ... (@(i)(sprintf ('xg(%03d)', i)), 1:NT, 'UniformOutput', false)'; % Values of the function on the grid zg = stk_feval (f, xg); zg.colnames = {'z'}; %% Initial design of experiments % % We start with an initial design of N0 points, regularly spaced on the domain. % % Size of the initial design N0 = 3; % Construction of the initial design x0 = stk_sampling_regulargrid (N0, DIM, BOX); % Give names explicit names to the points in the initial design x0.rownames = arrayfun ... (@(i)(sprintf ('x0(%03d)', i)), 1:N0, 'UniformOutput', false)'; % Values of the function on the initial design z0 = stk_feval (f, x0); z0.colnames = {'z'}; %% Specification of the model (Gaussian process prior) % % We choose a Matern 5/2 covariance with "fixed parameters" (in other % words, the variance and range parameters of the covariance function are % provided by the user rather than estimated from data). % model = stk_model ('stk_materncov52_iso'); % NOTE: the suffix '_iso' indicates an ISOTROPIC covariance function, but the % distinction isotropic / anisotropic is irrelevant here since DIM = 1. % Parameters for the Matern covariance function % ("help stk_materncov52_iso" for more information) SIGMA2 = 4.0 ^ 2; % variance parameter RHO1 = 2.0; % scale (range) parameter model.param = log ([SIGMA2; 1/RHO1]); % Play with the parameter of the model to understand their influence on the % behaviour of the algorithm ! %% Sequential design of experiments % % Here, evaluations points are chosen sequentially using the Expected % Improvement (EI) criterion, starting from the initial design defined above. % % The algorithm stops when either the maximum number of iterations is reached or % the maximum of the EI criterion falls below some threshold. % % Start with the initial design defined above data = horzcat (x0, z0); % Number of points to be added adaptively NB_ITER = 20; % Current value of the maximum of the Expected Improvement EI_max = +inf; % Value of EI_max for the stopping criterion EI_max_stop = (max (zg) - min (zg)) / 1e5; % Iteration number iter = 0; while (iter < NB_ITER) && (EI_max > EI_max_stop), % Trick: add a small "regularization" noise to our model model.lognoisevariance = 2 * log (min (1e-4, EI_max / 1e3)); % Carry out the kriging prediction z_pred = stk_predict (model, data.x, data.z, xg); % Compute the Expected Improvement (EI) criterion on the grid % (note the minus signs to address a *maximization* problem) EI_val = stk_sampcrit_ei_eval (-z_pred.mean, sqrt (z_pred.var), -data.z); % Pick the point where the EI is maximum as our next evaluation point [EI_max, i_max] = max (EI_val); % Figure: upper panel stk_subplot (2, 1, 1); hold off; % CG#12 stk_plot1d (data.x, data.z, xg, zg, z_pred); xlim (BOX); hold on; plot (xg(i_max), zg(i_max), 'ro', 'MarkerFaceColor', 'y'); % Figure: lower panel stk_subplot (2, 1, 2); cla; plot (xg, EI_val); xlim (BOX); hold on; plot (xg(i_max), EI_max, 'ro', 'MarkerFaceColor', 'y'); stk_ylabel ('EI'); if EI_max > EI_max_stop, % Add the new evaluation to the DoE new_row = horzcat (xg(i_max, :), zg(i_max, :)); data = vertcat (data, new_row); %#ok iter = iter + 1; end drawnow; %pause (0.2); end % Display the final DoE disp (data); % Total number of evaluations ? fprintf ('\nNumber of evaluations: %d + %d = %d.\n\n', N0, iter, N0 + iter); %!test stk_example_doe03; close all; stk/inst/examples/02_design_of_experiments/stk_example_doe04.m0000644000000000000000000000701213156161544021714 0ustar % STK_EXAMPLE_DOE04 Probability of misclassification % % The upper panel shows posterior means and variances as usual, and the % threshold of interest, which is at T = 0.85 (dashed line). % % The lower panel shows the probability of misclassification as a function of x % (blue curve), i.e., the probability that the actual value of the function is % not on the same side of the threshold as the prediction (posterior mean). % % We also plot the expected future probability of misclassification (magenta % curve), should a new evaluation be made at x = 3. % % Note that both probabilities are obtained using stk_pmisclass. % Copyright Notice % % Copyright (C) 2015, 2017 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . stk_disp_examplewelcome; stk_figure ('stk_example_doe04'); T = 0.85; f = @sin; % test function DIM = 1; % dimension of the factor space BOX = [0.0; 3.0]; % factor space x_obs = stk_dataframe ([0 0.2 0.4 1.5 2.0]', {'x'}); z_obs = stk_feval (f, x_obs); n = 400; x = stk_sampling_regulargrid (n, DIM, BOX); x.colnames = {'x'}; z = stk_feval (f, x); model = stk_model ('stk_materncov52_iso'); model.param = log ([0.1 0.8]); %% Current probability of misclassification % % Here we plot the CURRENT probability of misclassification of the response with % respect to the threshold T---i.e., the probability of misclassification given % the available data (x_obs, z_obs). z_pred = stk_predict (model, x_obs, z_obs, x); pmisclass = stk_pmisclass (T, z_pred); subplot (2, 1, 1); stk_plot1d (x_obs, z_obs, x, z, z_pred); hold on; plot (xlim, T * [1 1], 'k--'); subplot (2, 1, 2); plot (x, pmisclass); ylim ([0; 0.5]); stk_ylabel ('pmisclass'); %% Expected future probability of misclassification % % Now we plot the EXPECTED FUTURE probability of misclassification for an % additional evaluation at xnew---i.e, the expectation of the probability of % misclassification given the available data (x_obs, z_obs) and the future % response (x_new, f(x_new)). Teh expectation is taken with respect to the % unknown future response f(x_new). xnew = 3.0; % Location of the next evaluation [z_pred, ignore_lambda, ignore_mu, Kpost_all] = ... stk_predict (model, x_obs, z_obs, [x; xnew]); % Note: in recent versions of Octave or Matlab, you can use ~ to % ignore unwanted output arguments xihat_xt = z_pred(1:n, :); K12 = Kpost_all(1:n, end); % Posterior covariance between locations x and x_new K22 = Kpost_all(end, end); % Posterior variance at xnew expected_pmisclass = stk_pmisclass (T, xihat_xt, K12, K22); hold on; plot (x, expected_pmisclass, 'm'); legend ('current pmisclass', 'expected pmisclass', 'Location', 'SouthWest') %!test stk_example_doe04; close all; stk/inst/examples/02_design_of_experiments/stk_example_doe05.m0000644000000000000000000001344113156161544021720 0ustar % STK_EXAMPLE_DOE05 A simple illustration of 1D Bayesian optimization % % Our goal here is to minimize the one-dimensional function % % x |--> x * sin (x) % % over the interval [0; 4 * pi], using noisy evaluations. % % Evaluations points are chosen sequentially using either AKG criterion % (default) or the EQI criterion (set SAMPCRIT_NAME to 'EQI'); % Copyright Notice % % Copyright (C) 2015-2017 CentraleSupelec % Copyright (C) 2016 EDF R&D % Copyright (C) 2013, 2014 SUPELEC % % Authors: Julien Bect % Tom Assouline, Florent Autret & Stefano Duhamel (for EDF R&D) % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . stk_disp_examplewelcome; stk_figure ('stk_example_eqi_test'); %% Problem definition % Here we define a one-dimensional optimization problem. % The goal is to find the minimum of f on the domain BOX. % 1D test function f = @(x)(x .* sin (x)); % Define a 1D test function DIM = 1; % Dimension of the factor space BOX = stk_hrect ([0; 12], {'x'}); % Factor space (hyper-rectangle object) % Variance of the observation noise NOISE_VARIANCE = 2 ^ 2; % Space discretization GRID_SIZE = 200; % Number of points in the grid xg = stk_sampling_regulargrid (GRID_SIZE, DIM, BOX); % Give names explicit names to the points of the grid xg.rownames = arrayfun ... (@(i)(sprintf ('xg(%03d)', i)), 1:GRID_SIZE, 'UniformOutput', false)'; % Values of the function on the grid zg = stk_feval (f, xg); zg.colnames = {'z'}; %% Parameters affecting the sequential design algorithm N0 = 5; % Size of the initial (regularly spaced) design BUDGET = 100; % Total evaluation budget REESTIM_PERIOD = 10; % How often should we re-estimate the cov parameters ? SAMPCRIT_NAME = 'AKG'; % Choose a particular sampling criterion % Note: the two criteria proposed here compute an "expected improvement" of % some kind. As such, they return positive values, and must be maximized. switch SAMPCRIT_NAME case 'EQI' QUANTILE_ORDER = 0.5; POINT_BATCH_SIZE = @(x, n) BUDGET - n; sampcrit = stk_sampcrit_eqi ([], QUANTILE_ORDER, POINT_BATCH_SIZE); case 'AKG' sampcrit = stk_sampcrit_akg (); end %% Initial design of experiments % Construction of the initial design x0 = stk_sampling_regulargrid (N0, DIM, BOX); % Give names explicit names to the points in the initial design x0.rownames = arrayfun ... (@(i)(sprintf ('init%03d', i)), 1:N0, 'UniformOutput', false)'; % Simulate noisy observations of the initial design z0 = stk_feval (f, x0); z0.colnames = {'z'}; z0 = z0 + sqrt (NOISE_VARIANCE) * randn (size (z0)); %% Specification of the model (Gaussian process prior) model0 = stk_model ('stk_materncov52_iso'); % Assume that the variance of the observation noise is known model0.lognoisevariance = log (NOISE_VARIANCE); % Add a prior on covariance parameters (log (sigma^2), log (1/rho)) model0.prior.mean = log ([1.0; 1/4.0]); model0.prior.invcov = diag (1 ./ [+inf log(2)^2]); %% Sequential design of experiments % Here, evaluations points are chosen sequentially using the sampling criterion, % starting from the initial design defined above. % Plot only once in a while PLOT_PERIOD = 5; % Start from the initial design x = x0; z = z0; for iter = 1:(BUDGET - N0) if mod (iter, REESTIM_PERIOD) == 1 % Create posterior model object from scratch % (covariance function parameters estimated by marginal MAP) model = stk_model_gpposterior (model0, x, z); else % Update posterior model object % (covariance function parameters not re-estimated) model = stk_model_update (model, x_new, z_new); end % Instanciate sampling criterion object with model sampcrit.model = model; % Compute the EQI criterion on the grid [crit_val, z_pred] = sampcrit (xg); if mod (iter, PLOT_PERIOD) == 1 % Figure: upper panel stk_subplot (2, 1, 1); hold off; % CG#12 stk_plot1d ([],[], xg, zg, z_pred); hold on; plot (x, z, 'k.'); % Figure: lower panel stk_subplot (2, 1, 2); cla; plot (xg, crit_val); xlim (BOX); ylabel (SAMPCRIT_NAME); end if all (crit_val == 0), break, end % Pick the point where the EQI is maximum as our next evaluation point [crit_max, i_max] = max (crit_val); x_new = xg(i_max, :); % Simulate a new observation at the selected location z_new = zg(i_max, :) + sqrt (NOISE_VARIANCE) * randn; % Indicate new point on the lower panel if mod (iter, PLOT_PERIOD) == 1 hold on; plot (x_new, crit_max, 'ro', 'MarkerFaceColor', 'y'); end % Add the new evaluation to the DoE x = vertcat (x, x_new); z = vertcat (z, z_new); drawnow; % pause end % Display the final DoE data = stk_dataframe ([x z], {'x', 'z'}); disp (data); % Total number of evaluations ? fprintf ('\nNumber of evaluations: %d + %d = %d.\n\n', N0, BUDGET - N0, BUDGET); %#ok<*AGROW> %!test stk_example_doe05; close all; stk/inst/examples/03_miscellaneous/0000755000000000000000000000000013156161544014513 5ustar stk/inst/examples/03_miscellaneous/stk_example_misc01.m0000644000000000000000000000501513156161544020362 0ustar % STK_EXAMPLE_MISC01 Several correlation functions from the Matern family % % The Matern 1/2 correlation function is also known as the "exponential correla- % tion function". This is the correlation function of an Ornstein-Ulhenbeck pro- % cess. % % The Matern covariance function tends to the Gaussian correlation function when % its regularity (smoothness) parameter tends to infinity. % % See also: stk_materncov_iso, stk_materncov_aniso % Copyright Notice % % Copyright (C) 2011-2014 SUPELEC % % Authors: Julien Bect % Emmanuel Vazquez % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . stk_disp_examplewelcome; stk_figure ('stk_example_misc01'); %% List of correlation functions SIGMA2 = 1.0; % variance parameter RHO1 = 1.0; % scale (range) parameter % kriging with constant mean function (ordinary kriging) list_cov = {... 'Matern 1/2', 'stk_materncov_iso', log([SIGMA2; 0.5; 1/RHO1]); ... 'Matern 3/2', 'stk_materncov32_iso', log([SIGMA2; 1/RHO1]); ... 'Matern 5/2', 'stk_materncov52_iso', log([SIGMA2; 1/RHO1]); ... 'Matern 8.0', 'stk_materncov_iso', log([SIGMA2; 8.0; 1/RHO1]); ... 'Gaussian', 'stk_gausscov_iso', log([SIGMA2; 1/RHO1]) }; NB_COVARIANCE_FUNCTIONS = size (list_cov, 1); %% Visualisation x1 = 0.0; x2 = stk_sampling_regulargrid (1000, 1, [-5; 5]); col = {'r', 'b', 'g', 'k', 'm--'}; for j = 1:NB_COVARIANCE_FUNCTIONS, covfun = list_cov{j, 2}; param = list_cov{j, 3}; plot (x2, feval (covfun, param, x1, x2 ), col{j}); hold on; end stk_labels ('x', 'correlation r(x)'); legend (list_cov{:, 1}); stk_title ('Some members of the Matern family'); %!test stk_example_misc01; close all; stk/inst/examples/03_miscellaneous/stk_example_misc02.m0000644000000000000000000001076713156161544020375 0ustar % STK_EXAMPLE_MISC02 How to use priors on the covariance parameters % % A Matern covariance in dimension one is considered as an example. A Gaussian % prior is used for all three parameters: log-variance, log-regularity and log- % inverse-range. The corresponding parameter estimates are Maximum A Posteriori % (MAP) estimates or, more precisely, Restricted MAP (ReMAP) estimates. % % Several values for the variance of the prior are successively considered, to % illustrate the effect of this prior variance on the parameter estimates. When % the variance is small, the MAP estimate is close to the mode of the prior. On % the other hand, when the variance is large, the prior becomes "flat" and the % MAP estimate is close to the ReML estimate (see figure b). % Copyright Notice % % Copyright (C) 2012-2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . stk_disp_examplewelcome %% DEFINE AN ARTIFICIAL ONE-DIMENSIONAL DATASET DIM = 1; % dimension of the factor space BOX = [0.0; 1.0]; % factor space xi = [0.25; 0.26; 0.50; 0.60]; zi = [1.00; 1.10; 0.20; 0.35]; %% SPECIFICATION OF THE MODEL & REML ESTIMATION model = stk_model ('stk_materncov_iso'); % small "regularization noise". model.lognoisevariance = 2 * log (1e-6); % Mode of the prior on the parameters of the Matern covariance % (also serves as an initial guess for the optimization) SIGMA2 = 1.0; % variance parameter NU = 2.0; % regularity parameter RHO1 = 0.4; % scale (range) parameter param0 = log ([SIGMA2; NU; 1/RHO1]); % Estimate covariance parameters (without prior) model.param = stk_param_estim (model, xi, zi, param0); param_opt_reml = model.param; %% EXPERIMENT WITH SEVERAL VALUES FOR PRIOR VARIANCES std_list = [10 1 0.2 0.01]; NT = 400; % nb of points in the grid xt = stk_sampling_regulargrid (NT, DIM, BOX); stk_figure ('stk_example_misc02 (a)'); param_opt = zeros (length (param0), length (std_list)); for k = 1:length (std_list), % Prior on the parameters of the Matern covariance model.prior.mean = param0; model.prior.invcov = eye (length (param0)) ./ (std_list(k)^2); % Estimate covariance parameters (with a prior) model.param = stk_param_estim (model, xi, zi, param0); param_opt(:, k) = model.param; % Carry out kriging prediction zp = stk_predict (model, xi, zi, xt); % Plot predicted values and pointwise confidences intervals stk_subplot (2, 2, k); stk_plot1d (xi, zi, xt, [], zp); stk_labels ('input x', 'predicted output z'); stk_title (sprintf ('prior std = %.2f', std_list(k))); end %% FIGURE: ESTIMATED PARAMETER VERSUS PRIOR STD stk_figure ('stk_example_misc02 (b)'); param_name = {'SIGMA2', 'NU', '1/RHO'}; for j = 1:3, stk_subplot (2, 2, j); % estimated parameter versus prior std h = semilogx (std_list, exp (param_opt(j, :)), 'ko-'); set (h, 'LineWidth', 2, 'MarkerFaceColor', 'y'); stk_labels ('prior std', param_name{j}); % add an horizontal line showing the value of REML estimation hold on; semilogx (xlim, exp (param_opt_reml(j)) * [1 1], 'r--'); % add a second horizontal line showing the mode of the prior hold on; semilogx (xlim, exp (param0(j)) * [1 1], 'b--'); % adjust ylim yy = exp ([param_opt(j, :) param_opt_reml(j) param0(j)]); ylim_min = min (yy); ylim_max = max (yy); delta = ylim_max - ylim_min; ylim ([ylim_min - 0.05*delta ylim_max + 0.05*delta]); end if ~ strcmp (graphics_toolkit (), 'gnuplot') h1 = legend ('MAP estimates', 'REML estimate', 'mode of the prior'); h2 = stk_subplot (2, 2, 4); axis off; set (h1, 'Position', get (h2, 'Position')); end %!test stk_example_misc02; close all; stk/inst/examples/03_miscellaneous/stk_example_misc03.m0000644000000000000000000000500613156161544020364 0ustar % STK_EXAMPLE_MISC03 How to deal with (known) seasonality % Copyright Notice % % Copyright (C) 2016 CentraleSupelec % Copyright (C) 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . stk_disp_examplewelcome %% Sinusoid + noise t_obs = (0:0.05:12)'; S_obs = sin (t_obs + 0.3) + 0.1 * randn (size (t_obs)); stk_figure ('stk_example_misc03'); plot (t_obs, S_obs, 'k.'); stk_labels ('month number t', 'sunspots S'); t = (0:0.01:30)'; %% Gaussian process model with constant prior mean model = stk_model ('stk_materncov52_iso'); % Initial guess for the parameters of the Matern covariance [param0, lnv0] = stk_param_init (model, t_obs, S_obs, [], true); % Estimate the parameters [model.param, model.lognoisevariance] = stk_param_estim ... (model, t_obs, S_obs, param0, lnv0); % Carry out the kriging prediction S_posterior = stk_predict (model, t_obs, S_obs, t); % Display the result hold on; plot (t, S_posterior.mean, 'r-'); %% Gaussian process model with seasonality % Periodicity assumed to be known T0 = 2 * pi; % Construct a prior model with sinusoidal trend model2 = stk_model ('stk_materncov52_iso'); model2.lm = @(t)([ones(length(t),1) sin(2*pi*t/T0) cos(2*pi*t/T0)]); % Initial guess for the parameters of the Matern covariance [param0, lnv0] = stk_param_init (model2, t_obs, S_obs, [], true); % Estimate the parameters [model2.param, model2.lognoisevariance] = ... stk_param_estim (model2, t_obs, S_obs, param0, lnv0); % Carry out the kriging prediction S_posterior = stk_predict (model2, t_obs, S_obs, t); % Display the result hold on; plot (t, S_posterior.mean, 'g-'); %% Display models model model2 %#ok<*NOPTS> %!test stk_example_misc03; close all; stk/inst/examples/03_miscellaneous/stk_example_misc04.m0000644000000000000000000000607013156161544020367 0ustar % STK_EXAMPLE_MISC04 Pareto front simulation % % DESCRIPTION % % We consider a bi-objective optimization problem, where the objective % functions are modeled as a pair of independent stationary Gaussian % processes with a Matern 5/2 anisotropic covariance function. % % Figure (a): represent unconditional realizations of the Pareto front and % and estimate of the probability of being non-dominated at each point % of the objective space. % % Figure (b): represent conditional realizations of the Pareto front and % and estimate of the posteriorior probability of being non-dominated % at each point of the objective space. % % EXPERIMENTAL FUNCTION WARNING % % This script uses the stk_plot_probdom2d function, which is currently % considered an experimental function. Read the help for more information. % % REFERENCE % % [1] Michael Binois, David Ginsbourger and Olivier Roustant, Quantifying % uncertainty on Pareto fronts with Gaussian Process conditional simu- % lations, European J. of Operational Research, 2043(2):386-394, 2015. % % See also: stk_plot_probdom2d % Copyright Notice % % Copyright (C) 2017 CentraleSupelec % Copyright (C) 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . stk_disp_examplewelcome; %% Objective functions DIM = 2; BOX = [[0; 5] [0; 3]]; f1 = @(x) 4 * x(:,1) .^ 2 + 4 * x(:,2) .^ 2; f2 = @(x) (x(:,1) - 5) .^ 2 + (x(:,2) - 5) .^ 2; %% Data n_obs = 10; x_obs = stk_sampling_maximinlhs (n_obs, [], BOX); z_obs = zeros (n_obs, 2); z_obs(:, 1) = f1 (x_obs.data); % Remark: f1 (x_obs) should be OK... z_obs(:, 2) = f2 (x_obs.data); % ... but see Octave bug #49267 %% Stationary GP models model1 = stk_model ('stk_materncov52_aniso', DIM); model1.param = stk_param_estim (model1, x_obs, z_obs(:, 1)); model2 = stk_model ('stk_materncov52_aniso', DIM); model2.param = stk_param_estim (model2, x_obs, z_obs(:, 1)); stk_figure ('stk_example_misc04 (a)'); stk_plot_probdom2d (model1, model2, BOX); %% Conditionned GP models stk_figure ('stk_example_misc04 (b)'); stk_plot_probdom2d ( ... stk_model_gpposterior (model1, x_obs, z_obs(:, 1)), ... stk_model_gpposterior (model2, x_obs, z_obs(:, 2)), BOX); %!test stk_example_misc04; close all; stk/inst/examples/datasets/0000755000000000000000000000000013156161544013156 5ustar stk/inst/examples/datasets/stk_dataset_twobumps.m0000644000000000000000000001412713156161544017607 0ustar % STK_DATASET_TWOBUMPS defines datasets based on the TwoBumps response function % Copyright Notice % % Copyright (C) 2016 CentraleSupelec % % Authors: Julien Bect % Emmanuel Vazquez % Copying Permission Statement (STK toolbox) % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . % Copying Permission Statement (this file) % % To the extent possible under law, Julien Bect and Emmanuel Vazquez % have waived all copyright and related or neighboring rights to % stk_dataset_twobumps.m. This work is published from France. % % License: CC0 function [xi, zi, ref] = stk_dataset_twobumps (dataset_name, simulate) if nargin < 2 % Default: use saved versions of noisy datasets (for reproducibility) simulate = false; end ref.f = @stk_testfun_twobumps; % Factor space (i.e., input space) ref.box = [-1.0; 1.0]; % Reference dataset ref.xt = stk_sampling_regulargrid (400, [], ref.box); ref.zt = stk_feval (ref.f, ref.xt); switch dataset_name case 'noiseless' % Indices of six evaluation points in xt ref.xi_ind = [1 20 90 200 300 350]; % Evaluation points xi = ref.xt(ref.xi_ind, 1); % Evaluation results zi = stk_feval (ref.f, xi); case 'noisy1' % Number of noisy observations n = 20; % Standard deviation of the (Gaussian) observation noise ref.noise_std = 0.2; % Evaluation points on a regular grid xi = stk_sampling_regulargrid (n, [], ref.box); % Standard Gaussian noise if simulate u = randn (n, 1); else u = [ ... +2.494262357945395; -0.734979628183384; +0.482374373838845; ... +0.723297790408916; -0.698828108725056; -0.544234733755390; ... +0.200719359571192; +0.114419113713883; -2.430087055004133; ... +0.982006706100309; +1.043148691468279; +0.332804939718977; ... -0.014386709815515; -0.470223054833317; -0.504604762739981; ... +1.214912259853930; -0.514268293209969; +0.195757395918953; ... +1.517874831056133; +0.753351049482162]; end % Evaluation results with homoscedastic Gaussian noise zi = stk_feval (ref.f, xi) + ref.noise_std * u; case 'noisy2' % Standard deviation function of the heteroscedastic noise ref.noise_std_func = @(x) 0.1 + (x + 1) .^ 2; % Evaluation points xi1 = stk_sampling_regulargrid (30, [], ref.box); xi2 = stk_sampling_regulargrid (50, [], [0; 1]); xi = [xi1; xi2]; n = size (xi, 1); % Standard deviation of the noise ref.noise_std = ref.noise_std_func (xi.data); % Standard Gaussian noise if simulate u = randn (n, 1); else u = [ ... -0.791478467901437; -1.762943052690207; -0.001299829346851; ... +0.732147620330301; +0.605023011882157; -0.235236784824946; ... +1.229945155335280; +0.886837017097442; +0.488261575509975; ... +0.424488726533523; +1.754745494583444; -0.441222483623965; ... +0.879192878193787; +0.324020151981654; +0.084432929005424; ... -0.604693498668125; -0.031299228423533; +0.007433332039656; ... -0.107529006311618; +0.890983601251905; -0.696857251549359; ... -0.394367071934840; +1.209585103839413; +0.720950468832869; ... +0.188359447172079; -0.659677837960163; +0.254008558054221; ... -1.264954661580136; +0.816118804592636; +0.202455570359224; ... +0.734286747946277; -0.244906212630412; +0.274108676705772; ... -0.862005106214534; +0.434343874659720; -0.117332608645138; ... -0.914714934350702; +0.115661357086073; -0.325149459903396; ... +0.639533386284049; +0.509460672890649; -0.852768546081912; ... +0.186192416612840; +0.313594500855111; +0.294019880744365; ... -1.130158251045297; -0.766406113410912; -1.866775028802603; ... -0.947126212506609; +0.538816492914357; +0.511602507613618; ... +0.823135354100495; -1.756797156406481; -0.312291404135173; ... +0.087942003030425; +0.567707468547421; +2.032871465968247; ... +1.898136463799602; +0.017457787439612; -0.544269383534046; ... -0.031505371902443; -0.152838878112194; -1.329039092306233; ... +1.080298915753245; +1.010267794177553; -0.786523836101804; ... -1.172017693806294; +0.545622109584444; -0.565273496172850; ... +1.395393272315889; +2.249339864785413; +1.152166643543791; ... -0.529253078296878; -0.550879429738137; -0.658033963155681; ... -2.229148823293678; -0.883276090753784; -1.048334125700457; ... +0.787058154693710; +2.284606236947447]; end % Evaluation results with homoscedastic Gaussian noise zi = stk_feval (ref.f, xi) + ref.noise_std .* u; otherwise error ('Unknown dataset name.'); end % switch end % function stk/inst/examples/test_functions/0000755000000000000000000000000013156161544014415 5ustar stk/inst/examples/test_functions/stk_testcase_truss3.m0000644000000000000000000002142613156161544020617 0ustar % STK_TESTCASE_TRUSS3 provides information about the 'truss3' test case % % CALL: TC = stk_testcase_truss3 () % % returns a structure TC that describes the 'truss3' test case, borrowed % from [1, chapter 9]. This structure contains two fields: % % * .constants: all the numerical constants for this problem, % % * .search_domain: an stk_hrect object that specifies the search domain % of the optimization problem. % % TEST CASE OVERVIEW % % The system considered in this test case is the following 3-bar truss: % % <--------- D -----------> % <--- w ---> % ------A==========B==============C------ % \_ | __/ ^ % \_ | (2) __/ | % \_ | __/ L % (1) \_ | __/ (3) | % \_P_/ v % % Nodes A, B and C are fixed (pin joints). Node D is submitted to both an % horizontal load F1 (e.g., wind) and a vertical load F2 (suspended load). % % The design variables are the cross-sections a1, a2 and a3 of the three % bars, and the horizontal position w of the vertical bar. The quantities % of interest are the total volume of the structure, the mechanical % (tensile) stress in the bars, and the displacement of P. Various % formulations of optimization problems can be considered, depending on % which quantities are selected as contraints and objectives, and whether % or not uncertainties are taken into account (robust formulations). % % NUMERICAL CONSTANTS % % The numerical values borrowed from [1] have been converted to SI % units. The fields of TC.constants are: % % * .D: truss width [m], % * .L: length of the vertical bar [m], % * .E: Young's modulus [Pa], % % * .a_min: minimal cross-section [m^2], % * .a_max: maximal cross-section [m^2], % * .w_min: minimal value of the position of the vertical bar [m], % * .w_max: maximal value of the position of the vertical bar [m], % % * .F1_mean: mean (nominal) value of the horizontal load [N], % * .F1_std: standard deviation of the horizontal load [N], % * .F2_mean: mean (nominal) value of the vertical load [N] % * .F2_std: standard deviation of the vertical load [N]. % % The standard deviations .F1_std and .F2_std are used in the formulation % of robust optimization problems related to this test case [see 1, chap 11]. % % NUMERICAL FUNCTIONS % % Two numerical functions are provided to compute the quantities of interest % of this test case: % % * stk_testfun_truss3_vol: computes the total volume of the structure, % % * stk_testfun_truss3_bb: computes the tensile stress in the bars and the % displacement of P. % % Both functions have the same syntax: % % V = stk_testfun_truss3_vol (X, CONST) % % Z = stk_testfun_truss3_bb (X, CONST) % % where CONST is a structure containing the necessary numerical constants. % To use the constants from [1], pass TC.constants as second input argument. % % Both function accept as first input argument an N x D matrix (or data % frame) where D is either 4 or 6: % % * columns 1--3: cross-section a1, a2 and a3, % % * column 4: position w of the horizontal bar, % % * column 5-6 (optional): horizontal and vertical loads F1, F2. % % The second function is named 'bb' for 'black box', as it plays the role of % a (supposedly expensive to evaluate) black box computer model for this % test case. The output Z has five columns, corresponding to: % % * columns 1--2: horizontal and vertical displacement y1, y2 of P, % % * columns 3--5: tensile stress sigma_j in bars j = 1, 2 and 3. % % EXAMPLE % % tc = stk_testcase_truss3 (); n = 5; % % % Draw 5 points uniformly in the 4D input domain ("design space") % xd = stk_sampling_randunif (n, [], tc.search_domain) % % % Compute the volumes % v = stk_testfun_truss3_vol (xd, tc.constants) % % % Compute displacements and stresses for nominal loads % z = stk_testfun_truss3_bb (xd, tc.constants) % % % Draw loads from normal distributions % F = stk_dataframe (zeros (n, 2), {'F1' 'F2'}); % F(:, 1) = tc.constants.F1_mean + tc.constants.F1_std * randn (n, 1); % F(:, 2) = tc.constants.F2_mean + tc.constants.F2_std * randn (n, 1); % % % Compute displacements and stresses for the random loads % x = [xd F] % z = stk_testfun_truss3_bb (x, tc.constants) % % REFERENCE % % [1] Indraneel Das, Nonlinear Multicriteria Optimization and Robust % Optimality. PhD thesis, Rice University, 1997. % % [2] Juhani Koski, Defectiveness of weighting method in multicriterion % optimization of structures. Int. J. for Numerical Methods in % Biomedical Engineering, 1(6):333-337, 1985. % % See also: stk_testfun_truss3_vol, stk_testfun_truss3_bb % Copyright Notice % % This file: stk_testcase_truss3.m was written in 2017 % by Julien Bect . % % To the extent possible under law, the author(s) have dedicated all % copyright and related and neighboring rights to this file to the pub- % lic domain worldwide. This file is distributed without any warranty. % % This work is published from France. % % You should have received a copy of the CC0 Public Domain Dedication % along with this file. If not, see % . % Copying Permission Statement (STK toolbox as a whole) % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function tc = stk_testcase_truss3 () tc = struct (); %--- Numerical constants ------------------------------------------------------- % Conversion from feet to meters m_per_foot = 0.3048; m_per_inch = m_per_foot / 12; % Conversion from lbf (pound-force) to newtons (N) N_per_lbf = 4.4482216152605; N_per_kip = 1000 * N_per_lbf; % Conversion from psi (pound-force per square inch) to Pa (pascals) Pa_per_psi = N_per_lbf / (m_per_inch ^ 2); Ps_per_ksi = 1000 * Pa_per_psi; % Constants in Das (97) (differs from the test case used by Koski (1985)) % Truss width constants.D = 120 * m_per_foot; % [m] 120 feet ~ 36.6 m % Length of the vertical bar constants.L = 60 * m_per_foot; % [m] 60 feet ~ 18.3 m % Young's modulus (steel) constants.E = 29e3 * Ps_per_ksi; % [Pa] 29e3 ksi ~ 200 GPa % Minimal and maximal cross-sections constants.a_min = 0.8 * m_per_inch ^ 2; % [m^2] 0.8 in^2 ~ 5.2 cm^2 constants.a_max = 3.0 * m_per_inch ^ 2; % [m^2] 0.8 in^2 ~ 19.4 cm^2 % Bounds the position of the vertical bar constants.w_min = constants.D / 4; % [m] constants.w_max = 3 * constants.w_min; % [m] % Normal distribution on the loads constants.F1_mean = 100 * N_per_kip; constants.F1_std = 15 * N_per_kip; constants.F2_mean = 1000 * N_per_kip; constants.F2_std = 25 * N_per_kip; %--- Search domain (bounds on design variables) -------------------------------- a_dom = stk_hrect ( ... % Bounds on cross-sections repmat ([constants.a_min; constants.a_max], 1, 3), {'a1', 'a2', 'a3'}); w_dom = stk_hrect ( ... % Bounds on w [constants.w_min; constants.w_max], {'w'}); search_domain = [a_dom w_dom]; %--- Store everything inside a structure --------------------------------------- tc.constants = constants; tc.search_domain = search_domain; end % function %!shared tc, xd, n %! tc = stk_testcase_truss3 (); n = 5; %! xd = stk_sampling_randunif (n, [], tc.search_domain); %!test %! v = stk_testfun_truss3_vol (xd, tc.constants); %! z = stk_testfun_truss3_bb (xd, tc.constants); %! assert (isequal (size (v), [n 1])); %! assert (isequal (size (z), [n 5])); %!test %! F = stk_dataframe (zeros (n, 2), {'F1' 'F2'}); %! F(:, 1) = tc.constants.F1_mean + tc.constants.F1_std * randn (n, 1); %! F(:, 2) = tc.constants.F2_mean + tc.constants.F2_std * randn (n, 1); %! x = [xd F]; %! v = stk_testfun_truss3_vol (x, tc.constants); %! z = stk_testfun_truss3_bb (x, tc.constants); %! assert (isequal (size (v), [n 1])); %! assert (isequal (size (z), [n 5])); stk/inst/examples/test_functions/stk_testfun_borehole.m0000644000000000000000000000662413156161544021033 0ustar % STK_TESTFUN_BOREHOLE computes the "borehole model" response function % % CALL: Y = stk_testfun_borehole (X) % % computes the responses Y(i, :) of the "borehole model" [1-3] for the % input vectors X(i, :). % % The output Y is the water flow rate through the borehole (m3/yr). % % The input variables (columns of X) are: % % X(:, 1) = rw radius of borehole (m), % X(:, 2) = r radius of influence (m), % X(:, 3) = Tu transmissivity of upper aquifer (m2/yr), % X(:, 4) = Hu potentiometric head of upper aquifer (m), % X(:, 5) = Tl transmissivity of lower aquifer (m2/yr), % X(:, 6) = Hl potentiometric head of lower aquifer (m), % X(:, 7) = L length of borehole (m), % X(:, 8) = Kw hydraulic conductivity of borehole (m/yr), % % and their usual domain of variation is: % % input_domain = stk_hrect ([ ... % 0.05 100 63070 990 63.1 700 1120 9855; ... % 0.15 50000 115600 1110 116.0 820 1680 12045], ... % {'rw', 'r', 'Tu', 'Hu', 'Tl', 'Hl', 'L', 'Kw'}) % % REFERENCES % % [1] Harper, W. V. & Gupta, S. K. (1983). Sensitivity/uncertainty analysis % of a borehole scenario comparing Latin Hypercube Sampling and determinis- % tic sensitivity approaches. Technical report BMI/ONWI-516, Battelle % Memorial Inst., Office of Nuclear Waste Isolation, Columbus, OH (USA). % % [2] Morris, M. D., Mitchell, T. J. & Ylvisaker, D. (1993). Bayesian design % and analysis of computer experiments: use of derivatives in surface % prediction. Technometrics, 35(3):243-255. % % [3] Surjanovic, S. & Bingham, D. Virtual Library of Simulation Experiments: % Test Functions and Datasets. Retrieved February 1, 2016, from % http://www.sfu.ca/~ssurjano/borehole.html. % Copyright Notice % % Copyright (C) 2016 CentraleSupelec % % Author: Julien Bect % % Based on the "Virtual Library for Simulation Experiments" % Copyright (C) 2013 Derek Bingham, Simon Fraser University % Authors: Sonja Surjanovic & Derek Bingham (dbingham@stat.sfu.ca) % Distributed under the GPLv2 licence % http://www.sfu.ca/~ssurjano/Code/borehole.html % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function y = stk_testfun_borehole (x) x = double (x); rw = x(:, 1); r = x(:, 2); Tu = x(:, 3); Hu = x(:, 4); Tl = x(:, 5); Hl = x(:, 6); L = x(:, 7); Kw = x(:, 8); A = 2 * pi * Tu .* (Hu - Hl); B = 2 * L .* Tu ./ ((log (r ./ rw)) .* (rw .^ 2) .* Kw); C = Tu ./ Tl; D = (log (r ./ rw)) .* (1 + B + C); y = A ./ D; end % function stk/inst/examples/test_functions/stk_testfun_braninhoo.m0000644000000000000000000000353613156161544021212 0ustar % STK_TESTFUN_BRANINHOO computes the Branin-Hoo function. % % The Branin-Hoo function (Branin and Hoo, 1972) is a classical test % function for global optimization algorithms, which belongs to the % well-known Dixon-Szego test set (Dixon and Szego, 1978). It is usually % minimized over [-5; 10] x [0; 15]. % % REFERENCES % % [1] Branin, F. H. and Hoo, S. K. (1972), A Method for Finding Multiple % Extrema of a Function of n Variables, in Numerical methods of % Nonlinear Optimization (F. A. Lootsma, editor, Academic Press, % London), 231-237. % % [2] Dixon L.C.W., Szego G.P., Towards Global Optimization 2, North- % Holland, Amsterdam, The Netherlands (1978) % Copyright Notice % % Copyright (C) 2012-2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function y = stk_testfun_braninhoo (x) x = double (x); x1 = x(:, 1); x2 = x(:, 2); a = 5.1 / (4 * pi * pi); b = 5 / pi; c = 10 * (1 - 1 / (8 * pi)); y = (x2 - a * x1 .* x1 + b * x1 - 6) .^ 2 + c * cos (x1) + 10; end % function stk/inst/examples/test_functions/stk_testfun_goldsteinprice.m0000644000000000000000000000550213156161544022241 0ustar % STK_TESTFUN_GOLDSTEINPRICE computes the Goldstein-Price function % % The Goldstein-Price function [1] is a classical test function for % global optimization algorithms, which belongs to the well-known % Dixon-Szego test set [2]. % % It is usually minimized over [-2; 2] x [-2; 2]. It has a unique % global minimum at x = [0, -1] with f(x) = 3, and several local minima. % % REFERENCES % % [1] Goldstein, A.A. and Price, I.F. (1971), On descent from local % minima. Mathematics of Computation, 25(115). % % [2] Dixon L.C.W., Szego G.P. (1978), Towards Global Optimization 2, % North-Holland, Amsterdam, The Netherlands % Copyright Notice % % Copyright (C) 2014 SUPELEC % % Author: Julien Bect % % Based on the "Virtual Library for Simulation Experiments" % Copyright (C) 2013 Derek Bingham, Simon Fraser University % Authors: Sonja Surjanovic & Derek Bingham (dbingham@stat.sfu.ca) % Distributed under the GPLv2 licence % http://www.sfu.ca/~ssurjano/Code/goldprm.html % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function y = stk_testfun_goldsteinprice (x) if nargin == 0, visu_goldsteinprice (); return; end x = double (x); x1 = x(:, 1); x2 = x(:, 2); x1x1 = x1 .^ 2; x2x2 = x2 .^ 2; x1x2 = x1 .* x2; A1 = (x1 + x2 + 1) .^ 2; A2 = 19 - 14*x1 + 3*x1x1 - 14*x2 + 6*x1x2 + 3*x2x2; A = 1 + A1 .* A2; % 4th degree polynomial B1 = (2*x1 - 3*x2) .^ 2; B2 = 18 - 32*x1 + 12*x1x1 + 48*x2 - 36*x1x2 + 27*x2x2; B = 30 + B1 .* B2; % 4th degree polynomial y = A .* B; % 8th degree polynomial end % function function visu_goldsteinprice () s = 'Goldstein-Price function'; stk_figure (s); xt = stk_sampling_regulargrid (80^2, 2, [[-2; 2], [-2; 2]]); xt.colnames = {'x_1', 'x_2'}; surf (xt, @stk_testfun_goldsteinprice); hold on; plot3 (0, -1, 3, 'r.'); colorbar; stk_title (s); end % function %!test % Use with nargin == 0 for visualisation %! stk_testfun_goldsteinprice (); close all; %!assert (stk_isequal_tolabs ... %! (stk_testfun_goldsteinprice ([0, -1]), 3.0, 1e-12)) stk/inst/examples/test_functions/stk_testfun_truss3_bb.m0000644000000000000000000000752013156161544021136 0ustar % STK_TESTFUN_TRUSS3_BB computes displacements and stresses for 'truss3' % % CALL: Z = stk_testfun_truss3_bb (X, CONST) % % See also: stk_testcase_truss3, stk_testfun_truss3_vol % Copyright Notice % % This file: stk_testfun_truss3_bb.m was written in 2017 % by Julien Bect . % % To the extent possible under law, the author(s) have dedicated all % copyright and related and neighboring rights to this file to the pub- % lic domain worldwide. This file is distributed without any warranty. % % This work is published from France. % % You should have received a copy of the CC0 Public Domain Dedication % along with this file. If not, see % . % Copying Permission Statement (STK toolbox as a whole) % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function z = stk_testfun_truss3_bb (x, const) % Convert input to double-precision input data % (and get rid of extra structure such as table or stk_dataframe objects) x_ = double (x); % Check input size [n, dim] = size (x_); switch dim case 4 % Use nominal loads F = zeros (n, 2); F(:, 1) = const.F1_mean; F(:, 2) = const.F2_mean; x_ = [x_ F]; case 6 % Loads have been provided as well otherwise error ('Incorrect number of variables.'); end % Extract variables a = x_(:, 1:3); % Cross-sections of the bars [m^2] w = x_(:, 4); % Horizontal position of bar #2 [m] F = x_(:, 5:6); % Horizontal and vertical loads [N] % Extract constants D = const.D; % Total width of the structure [m] L = const.L; % Length of the vertical bar [m] E = const.E; % Young's modulus [Pa] % Check w values D_w = D - w; if any (w < 0) || any (D_w < 0) error ('w should be between 0 and D.') end % Lengths LL = repmat (L, [n 3]); LL(:, 1) = sqrt (L ^ 2 + w .^ 2); LL(:, 3) = sqrt (L ^ 2 + D_w .^ 2); % Sines and cosines sin_theta = L ./ LL(:, 1); cos_theta = w ./ LL(:, 1); sin_alpha = L ./ LL(:, 3); cos_alpha = D_w ./ LL(:, 3); % Linear relation between tensile forces and elongations, % assuming linear elasticity (Hooke's law) C = E * a ./ LL; % Compute displacement of node P and stresses y = zeros (n, 2); % Displacement of node P s = zeros (n, 3); % Tensile stress in the bars for i = 1:n % Rectangular matrix A for Equ. 9.1 in Das (1997) p.65, gives the % equilibrium relation between tensile forces and loads (small displacements) A = [cos_theta(i) sin_theta(i); 0 1; -cos_alpha(i) sin_alpha(i)]; % Stiffness matrix K = A' * (diag (C(i, :))) * A; % Compute the displacement of node P y(i, :) = F(i, :) / K; % Bar elongations delta = y(i, :) * A'; % Tensile stresses (Hooke's law) s(i, :) = E * delta ./ LL(i, :); end % Output: return displacement of node P and tensile stresses (five outputs) z = [y s]; % df-in/df-out if isa (x, 'stk_dataframe') z = stk_dataframe (z, {'y1' 'y2' 'sigma1' 'sigma2' 'sigma3'}, x.rownames); end end % function stk/inst/examples/test_functions/stk_testfun_truss3_vol.m0000644000000000000000000000426113156161544021352 0ustar % STK_TESTFUN_TRUSS3_VOL computes the volume of the 'truss3' structure % % CALL: V = stk_testfun_truss3_vol (X, CONST) % % See also: stk_testcase_truss3, stk_testfun_truss3_bb % Copyright Notice % % This file: stk_testfun_truss3_vol.m was written in 2017 % by Julien Bect . % % To the extent possible under law, the author(s) have dedicated all % copyright and related and neighboring rights to this file to the pub- % lic domain worldwide. This file is distributed without any warranty. % % This work is published from France. % % You should have received a copy of the CC0 Public Domain Dedication % along with this file. If not, see % . % Copying Permission Statement (STK toolbox as a whole) % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function V = stk_testfun_truss3_vol (x, const) % Convert input to double-precision input data % (and get rid of extra structure such as table or stk_dataframe objects) x_ = double (x); % Extract design variables a1 = x_(:, 1); a2 = x_(:, 2); a3 = x_(:, 3); w = x_(:, 4); % Extract constants L = const.L; D = const.D; % Length of bar 1 and bar 3 L1 = sqrt (L ^ 2 + w .^ 2); L3 = sqrt (L ^ 2 + (D - w) .^ 2); % Total volume V = a1 .* L1 + a2 * L + a3 .* L3; % df-in/df-out if isa (x, 'stk_dataframe') V = stk_dataframe (V, {'V'}, x.rownames); end end % function stk/inst/examples/test_functions/stk_testfun_twobumps.m0000644000000000000000000000366213156161544021113 0ustar % STK_TESTFUN_TWOBUMPS computes the TwoBumps response function % % CALL: Z = stk_testfun_twobumps (X) % % computes the response Z of the TwoBumps function at X. % % The TwoBumps function is defined as: % % TwoBumps(x) = - (0.7x + sin(5x + 1) + 0.1 sin(10x)) % % for x in [-1.0; 1.0]. % Copyright Notice % % Copyright (C) 2016 CentraleSupelec % % Authors: Julien Bect % Emmanuel Vazquez % % This response function (its opposite, actually) has been present as an % example in the STK toolbox since the very first releases (STK 1.0, 2011). % Copying Permission Statement (STK toolbox) % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . % Copying Permission Statement (this file) % % To the extent possible under law, Julien Bect and Emmanuel Vazquez % have waived all copyright and related or neighboring rights to % stk_testfun_twobumps.m. This work is published from France. % % License: CC0 function z = stk_testfun_twobumps (x) x = double (x); z = -(0.7 * x + (sin (5 * x + 1)) + 0.1 * (sin (10 * x))); end % function stk/inst/lm/0000755000000000000000000000000013156161544010140 5ustar stk/inst/lm/@stk_lm_affine/0000755000000000000000000000000013156161544013041 5ustar stk/inst/lm/@stk_lm_affine/feval.m0000644000000000000000000000232613156161544014317 0ustar % FEVAL [overload base function] % Copyright Notice % % Copyright (C) 2012-2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function z = feval (lm, x) %#ok n = size (x, 1); z = horzcat (ones (n, 1), x); end % function %!test %! n = 15; d = 4; %! x = stk_sampling_randunif (n, d); %! P = feval (stk_lm_affine (), x); %! assert (isequal (size (P), [n, d + 1])); stk/inst/lm/@stk_lm_affine/isequal.m0000644000000000000000000000271013156161544014662 0ustar % ISEQUAL [overload base function] % Copyright Notice % % Copyright (C) 2017 CentraleSupelec % Copyright (C) 2013, 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . % INTERNAL NOTE: overloaded for Octave 3.2.x compat / see CODING_GUIDELINES function b = isequal (x, y, varargin) if nargin < 2 stk_error ('Not enough input arguments.', 'NotEnoughInputArgs'); end % First, make sure that x and y belong to the same class % (either stk_dataframe or some derived class) b = isa (x, 'stk_lm_affine') && strcmp (class (y), class (x)); if b && (nargin > 2) b = isequal (x, varargin{:}); end end % function stk/inst/lm/@stk_lm_affine/stk_lm_affine.m0000644000000000000000000000256613156161544016031 0ustar % STK_LM_AFFINE creates an affine linear model object % % CALL: LM = STK_LM_AFFINE () % % creates an affine linear model object LM. % Copyright Notice % % Copyright (C) 2017 CentraleSupelec % Copyright (C) 2012-2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function lm = stk_lm_affine () if nargin > 0 stk_error ('Too many input arguments.', 'TooManyInputArgs'); end lm = class (struct (), 'stk_lm_affine'); end % function stk_lm_affine %!test stk_test_class ('stk_lm_affine') %!error lm = stk_lm_affine (3.33); stk/inst/lm/@stk_lm_constant/0000755000000000000000000000000013156161544013442 5ustar stk/inst/lm/@stk_lm_constant/feval.m0000644000000000000000000000230613156161544014716 0ustar % FEVAL [overload base function] % Copyright Notice % % Copyright (C) 2012-2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function z = feval (lm, x) %#ok n = size (x, 1); z = ones (n, 1); end % function %!test %! n = 15; d = 4; %! x = stk_sampling_randunif (n, d); %! P = feval (stk_lm_constant (), x); %! assert (isequal (size (P), [n, 1])); stk/inst/lm/@stk_lm_constant/isequal.m0000644000000000000000000000271213156161544015265 0ustar % ISEQUAL [overload base function] % Copyright Notice % % Copyright (C) 2017 CentraleSupelec % Copyright (C) 2013, 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . % INTERNAL NOTE: overloaded for Octave 3.2.x compat / see CODING_GUIDELINES function b = isequal (x, y, varargin) if nargin < 2 stk_error ('Not enough input arguments.', 'NotEnoughInputArgs'); end % First, make sure that x and y belong to the same class % (either stk_dataframe or some derived class) b = isa (x, 'stk_lm_constant') && strcmp (class (y), class (x)); if b && (nargin > 2) b = isequal (x, varargin{:}); end end % function stk/inst/lm/@stk_lm_constant/stk_lm_constant.m0000644000000000000000000000256513156161544017032 0ustar % STK_LM_CONSTANT creates a constant linear model object % % CALL: LM = STK_LM_CONSTANT () % % creates a constant linear model object LM. % Copyright Notice % % Copyright (C) 2017 CentraleSupelec % Copyright (C) 2012-2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function lm = stk_lm_constant () if nargin > 0 stk_error ('Too many input arguments.', 'TooManyInputArgs'); end lm = class (struct (), 'stk_lm_constant'); end % function %!test stk_test_class ('stk_lm_constant') %!error lm = stk_lm_constant (3.33); stk/inst/lm/@stk_lm_cubic/0000755000000000000000000000000013156161544012676 5ustar stk/inst/lm/@stk_lm_cubic/feval.m0000644000000000000000000000314213156161544014151 0ustar % FEVAL [overload base function] % Copyright Notice % % Copyright (C) 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function z = feval (lm, x) %#ok x = double (x); [n, d] = size (x); % Use stk_lm_quadratic to compute the quadratic part z2 = feval (stk_lm_quadratic, x); % And now compute all monomials of degree exactly 3 z3 = zeros (n, d * (2 + d * (3 + d)) / 6); c = 1; for i = 1:d u = x(:, i); for j = i:d v = u .* x(:, j); for k = j:d z3(:, c) = v .* x(:, k); c = c + 1; end end end z = horzcat (z2, z3); end % function %!test %! n = 15; d = 4; %! x = stk_sampling_randunif (n, d); %! P = feval (stk_lm_cubic (), x); %! assert (isequal (size (P), [n, 1 + d * (11 + d * (6 + d)) / 6])) stk/inst/lm/@stk_lm_cubic/isequal.m0000644000000000000000000000270713156161544014525 0ustar % ISEQUAL [overload base function] % Copyright Notice % % Copyright (C) 2017 CentraleSupelec % Copyright (C) 2013, 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . % INTERNAL NOTE: overloaded for Octave 3.2.x compat / see CODING_GUIDELINES function b = isequal (x, y, varargin) if nargin < 2 stk_error ('Not enough input arguments.', 'NotEnoughInputArgs'); end % First, make sure that x and y belong to the same class % (either stk_dataframe or some derived class) b = isa (x, 'stk_lm_cubic') && strcmp (class (y), class (x)); if b && (nargin > 2) b = isequal (x, varargin{:}); end end % function stk/inst/lm/@stk_lm_cubic/stk_lm_cubic.m0000644000000000000000000000253013156161544015512 0ustar % STK_LM_CUBIC creates a cubic linear model object % % CALL: LM = STK_LM_CUBIC () % % creates a cubic linear model object LM. % Copyright Notice % % Copyright (C) 2017 CentraleSupelec % Copyright (C) 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function lm = stk_lm_cubic () if nargin > 0 stk_error ('Too many input arguments.', 'TooManyInputArgs'); end lm = class (struct (), 'stk_lm_cubic'); end % function %!test stk_test_class ('stk_lm_cubic') %!error lm = stk_lm_cubic (3.33); stk/inst/lm/@stk_lm_matrix/0000755000000000000000000000000013156161544013115 5ustar stk/inst/lm/@stk_lm_matrix/feval.m0000644000000000000000000000217413156161544014374 0ustar % FEVAL [overload base function] % Copyright Notice % % Copyright (C) 2012-2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function z = feval (lm, x) x = double (x); if isempty (lm.data), n = size (x, 1); z = zeros (n, 0); else z = lm.data(x, :); end end % function stk/inst/lm/@stk_lm_matrix/isequal.m0000644000000000000000000000275413156161544014746 0ustar % ISEQUAL [overload base function] % Copyright Notice % % Copyright (C) 2017 CentraleSupelec % Copyright (C) 2013, 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . % INTERNAL NOTE: overloaded for Octave 3.2.x compat / see CODING_GUIDELINES function b = isequal (x, y, varargin) if nargin < 2 stk_error ('Not enough input arguments.', 'NotEnoughInputArgs'); end % First, make sure that x and y belong to the same class % (either stk_dataframe or some derived class) b = isa (x, 'stk_lm_matrix') && strcmp (class (y), class (x)) ... && isequal (x.data, y.data); if b && (nargin > 2) b = isequal (x, varargin{:}); end end % function stk/inst/lm/@stk_lm_matrix/stk_lm_matrix.m0000644000000000000000000000367413156161544016162 0ustar % STK_LM_MATRIX creates a linear model object defined on a finite space % % CALL: LM = STK_LM_MATRIX (P) % % creates a linear model object LM with "design matrix" P. Such an object % describes a linear model on a finite space of cardinality N, where N is the % number of rows of P. % Copyright Notice % % Copyright (C) 2017 CentraleSupelec % Copyright (C) 2012-2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function lm = stk_lm_matrix (data) if nargin > 1 stk_error ('Too many input arguments.', 'TooManyInputArgs'); end if nargin == 0 lm = struct ('data', []); else lm = struct ('data', data); end lm = class (lm, 'stk_lm_matrix'); end % function %!test stk_test_class ('stk_lm_matrix') %!error lm = stk_lm_matrix ([], 3.33); %!test %%% dim 1 %! data = rand (10, 1); idx = 3:7; %! lm = stk_lm_matrix (data); %! assert (isa (lm, 'stk_lm_matrix')); %! assert (isequal (data(idx, :), feval (lm, idx))); %!test %%% dim 3 %! data = rand (10, 3); idx = 3:7; %! lm = stk_lm_matrix (data); %! assert (isa (lm, 'stk_lm_matrix')); %! assert (isequal (data(idx, :), feval (lm, idx))); stk/inst/lm/@stk_lm_null/0000755000000000000000000000000013156161544012563 5ustar stk/inst/lm/@stk_lm_null/feval.m0000644000000000000000000000230213156161544014033 0ustar % FEVAL [overload base function] % Copyright Notice % % Copyright (C) 2012-2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function z = feval (lm, x) %#ok n = size (x, 1); z = zeros (n, 0); end % function %!test %! n = 15; d = 4; %! x = stk_sampling_randunif (n, d); %! P = feval (stk_lm_null (), x); %! assert (isequal (size (P), [n, 0])); stk/inst/lm/@stk_lm_null/isequal.m0000644000000000000000000000270613156161544014411 0ustar % ISEQUAL [overload base function] % Copyright Notice % % Copyright (C) 2017 CentraleSupelec % Copyright (C) 2013, 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . % INTERNAL NOTE: overloaded for Octave 3.2.x compat / see CODING_GUIDELINES function b = isequal (x, y, varargin) if nargin < 2 stk_error ('Not enough input arguments.', 'NotEnoughInputArgs'); end % First, make sure that x and y belong to the same class % (either stk_dataframe or some derived class) b = isa (x, 'stk_lm_null') && strcmp (class (y), class (x)); if b && (nargin > 2) b = isequal (x, varargin{:}); end end % function stk/inst/lm/@stk_lm_null/stk_lm_null.m0000644000000000000000000000252513156161544015270 0ustar % STK_LM_NULL creates a null linear model object % % CALL: LM = STK_LM_NULL () % % creates a null linear model object LM. % Copyright Notice % % Copyright (C) 2017 CentraleSupelec % Copyright (C) 2012-2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function lm = stk_lm_null () if nargin > 0 stk_error ('Too many input arguments.', 'TooManyInputArgs'); end lm = class (struct (), 'stk_lm_null'); end % function %!test stk_test_class ('stk_lm_null') %!error lm = stk_lm_null (3.33); stk/inst/lm/@stk_lm_quadratic/0000755000000000000000000000000013156161544013566 5ustar stk/inst/lm/@stk_lm_quadratic/feval.m0000644000000000000000000000260113156161544015040 0ustar % FEVAL [overload base function] % Copyright Notice % % Copyright (C) 2012-2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function z = feval (lm, x) %#ok x = double (x); [n, d] = size (x); z = horzcat (ones (n, 1), x, zeros (n, d * (d + 1) / 2)); k = d + 2; for i = 1:d for j = i:d z(:,k) = x(:, i) .* x(:, j); k = k + 1; end end end % function %!test %! n = 15; d = 4; %! x = stk_sampling_randunif (n, d); %! P = feval (stk_lm_quadratic (), x); %! assert (isequal (size (P), [n, 1 + d * (d + 3) / 2])); stk/inst/lm/@stk_lm_quadratic/isequal.m0000644000000000000000000000271313156161544015412 0ustar % ISEQUAL [overload base function] % Copyright Notice % % Copyright (C) 2017 CentraleSupelec % Copyright (C) 2013, 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . % INTERNAL NOTE: overloaded for Octave 3.2.x compat / see CODING_GUIDELINES function b = isequal (x, y, varargin) if nargin < 2 stk_error ('Not enough input arguments.', 'NotEnoughInputArgs'); end % First, make sure that x and y belong to the same class % (either stk_dataframe or some derived class) b = isa (x, 'stk_lm_quadratic') && strcmp (class (y), class (x)); if b && (nargin > 2) b = isequal (x, varargin{:}); end end % function stk/inst/lm/@stk_lm_quadratic/stk_lm_quadratic.m0000644000000000000000000000257513156161544017303 0ustar % STK_LM_QUADRATIC creates a quadratic linear model object % % CALL: LM = STK_LM_QUADRATIC () % % creates a quadratic linear model object LM. % Copyright Notice % % Copyright (C) 2017 CentraleSupelec % Copyright (C) 2012-2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function lm = stk_lm_quadratic () if nargin > 0 stk_error ('Too many input arguments.', 'TooManyInputArgs'); end lm = class (struct (), 'stk_lm_quadratic'); end % function %!test stk_test_class ('stk_lm_quadratic') %!error lm = stk_lm_quadratic (3.33); stk/inst/lm/stk_lm_polynomial.m0000644000000000000000000000456713156161544014066 0ustar % STK_LM_POLYNOMIAL creates a polynomial linear model object % % CALL: LM = STK_LM_POLYNOMIAL (D) % % creates a polynomial linear model object LM of degree D. % Copyright Notice % % Copyright (C) 2016, 2017 CentraleSupelec % Copyright (C) 2012-2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function lm = stk_lm_polynomial (order) % nargin check neded here. See https://sourceforge.net/p/kriging/tickets/52. if nargin < 1 stk_error ('Not enough input arguments.', 'NotEnoughInputArgs'); elseif nargin > 1 stk_error ('Too many input arguments.', 'TooManyInputArgs'); end switch order case -1, % 'simple' kriging lm = stk_lm_null (); case 0, % 'ordinary' kriging lm = stk_lm_constant (); case 1, % affine trend lm = stk_lm_affine (); case 2, % quadratic trend lm = stk_lm_quadratic (); case 3, % cubic trend lm = stk_lm_cubic (); otherwise, % syntax error stk_error ('order should be in {-1, 0, 1, 2, 3}', 'InvalidArgument'); end end % function %!error lm = stk_lm_polynomial (); %!error lm = stk_lm_polynomial (0, 3.33); %!test %! lm = stk_lm_polynomial (-1); %! assert (isa (lm, 'stk_lm_null')); %!test %! lm = stk_lm_polynomial (0); %! assert (isa (lm, 'stk_lm_constant')); %!test %! lm = stk_lm_polynomial (1); %! assert (isa (lm, 'stk_lm_affine')); %!test %! lm = stk_lm_polynomial (2); %! assert (isa (lm, 'stk_lm_quadratic')); %!test %! lm = stk_lm_polynomial (3); %! assert (isa (lm, 'stk_lm_cubic')); stk/inst/misc/0000755000000000000000000000000013156161544010463 5ustar stk/inst/misc/benchmarks/0000755000000000000000000000000013156161544012600 5ustar stk/inst/misc/benchmarks/stk_benchmark_.m0000644000000000000000000000313113156161544015726 0ustar % STK_BENCHMARK_ Benchmark stk_predict % Copyright Notice % % Copyright (C) 2017 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function t = stk_benchmark_ (testfun, nargout, nrep) varargout = cell (1, nargout); % First, warm up + choose number of repetitions nrep_internal = 1; ok = false; while ~ ok tic; for ii = 1:nrep_internal [varargout{:}] = testfun (); %#ok<*NASGU> end t_ = toc (); if t_ > 1e-2 ok = true; else nrep_internal = nrep_internal * 2; end end % Do the actual measurements t = zeros (1, nrep); for i = 1:nrep tic; for ii = 1:nrep_internal [varargout{:}] = testfun (); %#ok<*NASGU> end t(i) = toc / nrep_internal; end end % function stk/inst/misc/benchmarks/stk_benchmark_bivnorm.m0000644000000000000000000000415113156161544017326 0ustar % STK_BENCHMARK_BIVNORM % Copyright Notice % % Copyright (C) 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . mu = [1 2]; % means sigma = [3 4]; % standard deviations rho = 0.37; % correlation coefficients n = 1e5; z = 10 * (rand (n, 2) - 0.5); % Covariance matrix (for use with mvncdf) K11 = sigma(1) ^ 2; K12 = sigma(1) * sigma(2) * rho; K22 = sigma(2) ^2; % Compute with mvncdf tic; p_mvncdf = mvncdf (z, mu, [K11 K12; K12 K22]); t_mvncdf = toc; % Compute with stk_distrib_bivnorm_cdf tic; p_stk = stk_distrib_bivnorm_cdf (z, mu(1), mu(2), sigma(1), sigma(2), rho); t_stk = toc; err = abs (p_stk - p_mvncdf); fprintf ('t_stk = %.1f µs/eval\n', t_stk / n * 1e6); fprintf ('t_mvncdf = %.1f µs/eval\n', t_mvncdf / n * 1e6); fprintf ('t_mvncdf / t_stk = %.1f\n', t_mvncdf / t_stk); fprintf ('maximal absolute difference: %.2g\n', max (err)) fprintf ('maximal relative difference: %.2g\n', max (err ./ p_stk)) %%% Example of a "large" difference (approx. 1e-8 relative error) % % z1 = -3.798119125813876 % z2 = -4.397490942716200 % % p1 = stk_distrib_bivnorm_cdf ([z1 z2], 1, 2, 3, 4, 0.37) % % -> 1.0015256831575151e-02 % % p2 = mvncdf ([z1 z2], [1 2], [9 4.44; 4.44 16]); % % -> 1.0015256938405132e-02 (Matlab R2012a) % % -> 1.0015256831575156e-02 (Matlab R2016a) stk/inst/misc/benchmarks/stk_benchmark_cov1.m0000644000000000000000000000252213156161544016522 0ustar % STK_BENCHMARK_COV1 % Copyright Notice % % Copyright (C) 2016 CentraleSupelec % Copyright (C) 2013 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . %% Benchmark parameters DIM = 1; N = 500; REP = 5; covname = 'stk_materncov_iso'; %% Evaluate computation time model = stk_model (covname, DIM); model.param = [0 0 0]; tic; for i = 1:REP, x = stk_sampling_regulargrid (N, DIM); K = stk_make_matcov (model, x, x); end t = toc / REP; fprintf ('% 20s: %.3f seconds\n', covname, t); stk/inst/misc/benchmarks/stk_benchmark_cov2.m0000644000000000000000000000714013156161544016524 0ustar % STK_BENCHMARK_COV2 % Copyright Notice % % Copyright (C) 2016 CentraleSupelec % Copyright (C) 2013 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . %% Benchmark parameters DIM = 1; N_START = 50; N_MAX = 2000; covnames = { ... 'stk_materncov32_iso', ... 'stk_materncov52_iso', ... 'stk_materncov_iso' }; nb_cov = length (covnames); result = struct ('covname', [], 't', [], 'n', []); stk_figure ('stk_benchmark_cov2'); %% Main loop for j = 1:4, switch j case 1 disp ('Using stk_parallel_engine_none...'); stk_parallel_stop (); case 2 disp ('parallelization on (if available) / msfb = Inf'); stk_parallel_start (); M = stk_options_get ('stk_rbf_matern', 'min_size_for_parallelization'); stk_options_set ('stk_rbf_matern', 'min_size_for_parallelization', +Inf); case 3 disp ('parallelization on (if available) / msfb = 1'); stk_options_set ('stk_rbf_matern', 'min_size_for_parallelization', 1); case 4 fprintf ('parallelization on (if available) / msfb = %d (default)', M); stk_options_set ('stk_rbf_matern', 'min_size_for_parallelization', M); end for k = 1:nb_cov, % loop over covariance functions result(j, k).covname = covnames{k}; model = stk_model (covnames{k}, DIM); model.param = zeros (size (model.param)); REP = 5000; n = N_START; while n <= N_MAX tic; x = stk_sampling_regulargrid (n, DIM); for i = 1:REP, K = stk_make_matcov (model, x, x); end t = toc / REP; result(j, k).n(end+1) = n; result(j, k).t(end+1) = t; cla; loglog (result(j, k).n, result(j, k).t, 'o-'); drawnow; n = ceil (n * 1.4); REP = ceil (1 / t); end end end %% Figure legtxt = {}; %#ok<*AGROW> loglog (vertcat(result(1, :).n)', vertcat(result(1, :).t)', 'x:'); hold on; for k = 1:nb_cov legtxt = [legtxt {sprintf('%s (par. off)', covnames{k})}]; end loglog (vertcat(result(2, :).n)', vertcat(result(2, :).t)', 'o-'); for k = 1:nb_cov legtxt = [legtxt {sprintf('%s (par. on, msfp=+Inf)', covnames{k})}]; end loglog (vertcat(result(3, :).n)', vertcat(result(3, :).t)', 's--'); for k = 1:nb_cov legtxt = [legtxt {sprintf('%s (par. on, msfp=1)', covnames{k})}]; end loglog (vertcat(result(4, :).n)', vertcat(result(4, :).t)', 'd-.'); for k = 1:nb_cov legtxt = [legtxt {sprintf('%s (par. on, msfp=%d)', covnames{k}, M)}]; end h = legend (legtxt, 'Location', 'NorthWest'); set (h, 'Interpreter', 'none'); stk_labels ('n', 'computation time'); stk/inst/misc/benchmarks/stk_benchmark_examples.m0000644000000000000000000000516513156161544017476 0ustar % STK_BENCHMARK_EXAMPLES benchmarks all examples % Copyright Notice % % Copyright (C) 2016 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function results = stk_benchmark_examples (nb_rep) % Number of repetitions for each example script? if nargin < 1 nb_rep = 5; end % Save results results = []; % Browse example directory d0 = fileparts (which ('stk_init')); d0 = fullfile (d0, 'examples'); S0 = dir (d0); for i = 1:(length (S0)) if S0(i).isdir && (S0(i).name(1) ~= '.') % Browse sub-directory d1 = fullfile (d0, S0(i).name); S1 = dir (d1); for j = 1:(length (S1)) if regexp (S1(j).name, '^stk_example.*\.m') res.name = S1(j).name; res.fullname = fullfile (d1, S1(j).name); res.runtime = zeros (1, nb_rep); % Run and time for k = 1:nb_rep t0 = tic (); try run_in_isolation (res.fullname); res.runtime(k) = toc (t0); catch toc (t0); % stop the timer res.runtime(k) = nan; end close all; drawnow (); end res.median_runtime = median (res.runtime); if isempty (results) results = res; else results(end+1) = res; end end end end end % Display tic/toc results for i = 1:(length (results)) fprintf ('%20s: %7.3f sec\n', results(i).name, results(i).median_runtime); end end % function function run_in_isolation (fullname) run (fullname); drawnow (); end % function stk/inst/misc/benchmarks/stk_benchmark_init.m0000644000000000000000000000240013156161544016610 0ustar % STK_BENCHMARK_INIT measures stk_init's runtime % % Loading STK should be as fast as possible... % % This script can be used to tic-toc or profile stk_init (). % Copyright Notice % % Copyright (C) 2016 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . NREP = 10; t0 = tic (); for i = 1:NREP, stk_init (); end t = (toc (t0)) / NREP; fprintf ('Average runtime for a call to stk_init: %.3f seconds\n', t); stk/inst/misc/benchmarks/stk_benchmark_logdet.m0000644000000000000000000000344013156161544017130 0ustar % STK_BENCHMARK_LOGDET1 % Copyright Notice % % Copyright (C) 2016 CentraleSupelec % Copyright (C) 2013 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . % NREP = 1000; n = 20; % test on small matrices NREP = 100; n = 200; % test on large matrices d = 2; x = stk_sampling_maximinlhs (n, d, [], 10); model = stk_model ('stk_materncov52_aniso', d); model.param = zeros (size (model.param)); propname = { ... 'log_det_covariance_matrix_a', ... 'log_det_covariance_matrix_b', ... 'log_det_covariance_matrix_c', ... 'log_det_covariance_matrix_d', ... 'log_det_covariance_matrix_e' }; L = length (propname); t = zeros (L, 1); v = zeros (L, 1); for k = 1:L fprintf ('Method %d/%d: %s...', k, L, propname{k}); tic; for i = 1:NREP, kreq = stk_kreq_qr (model, x); logdet = get (kreq, propname{k}); end t(k) = toc / NREP; v(k) = logdet; fprintf ('\n'); end display (t) display (v) stk/inst/misc/benchmarks/stk_benchmark_loocv.m0000644000000000000000000000504113156161544016773 0ustar % STK_BENCHMARK_LOOCV Benchmark stk_predict_leaveoneout % % Compare run time of virtual LOO-CV implementation with respect to % the old, "direct" implementation. % % Note: correctness of implementation is already taken care of in the % unit tests. We only care about computation speed here. % Copyright Notice % % Copyright (C) 2017 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function t_out = stk_benchmark_loocv () nrep = 100; n = [10 20 40 80 160 320]; m = numel (n); t_virtual = zeros (nrep, m); t_direct = zeros (nrep, m); for i = 1:m fprintf ('i = %d/%d...\n', i, m); % Prepare test d = 1; x_obs = stk_sampling_regulargrid (n(i), d, [0; 2*pi]); z_obs = stk_feval (@sin, x_obs); model = stk_model ('stk_materncov32_iso', d); model.param = log ([1; 5]); model.lognoisevariance = (1 + rand (n(i), 1)) * 1e-3; M_post = stk_model_gpposterior (model, x_obs, z_obs); testfun = @() stk_predict_leaveoneout (M_post); t_virtual(:, i) = stk_benchmark_ (testfun, 2, nrep); testfun = @() stk_predict_leaveoneout_direct (M_post); t_direct(:, i) = stk_benchmark_ (testfun, 2, nrep); end % Express results in ms t_virtual = t_virtual * 1000; t_direct = t_direct * 1000; t = stk_dataframe (zeros (m, 4), {'virtual', '[mad]', 'direct', '[mad]'}); for i = 1:m t.rownames{i} = sprintf ('n = % 3d', n(i)); t(i, 1) = median (t_virtual(:, i)); t(i, 2) = median (abs (t_virtual(:, i) - t.virtual(i))); t(i, 3) = median (t_direct(:, i)); t(i, 4) = median (abs (t_direct(:, i) - t.direct(i))); end if nargout == 0 loocv_benchmark_results = t; display (loocv_benchmark_results); else t_out = t; end end % function stk/inst/misc/benchmarks/stk_benchmark_paramestim.m0000644000000000000000000000517013156161544020016 0ustar % STK_BENCHMARK_PARAMESTIM A simple 1D parameter estimation benchmark % Copyright Notice % % Copyright (C) 2016 CentraleSupelec % Copyright (C) 2011-2014 SUPELEC % % Authors: Julien Bect % Emmanuel Vazquez % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function stk_benchmark_paramestim () NREP = 20; for noise_std = [0 0.1], for ni = [10 50], t = zeros (1, NREP + 1); for i = 1:(NREP + 1), tic; test_function (ni, noise_std); t(i) = toc; end t = t(2:end); fprintf ('noise_std = %.1f ', noise_std); fprintf ('ni = %d ', ni); t_est = median (t); t_mad = mean (abs (t - t_est)); fprintf ('t = %.3f [%.3f]\n', t_est, t_mad); drawnow (); end end end function test_function (ni, noise_std) f = @(x)(- (0.8 * x + sin (5 * x + 1) + 0.1 * sin (10 * x))); DIM = 1; % Dimension of the factor space BOX = [-1.0; 1.0]; % Factor space NOISY = (noise_std > 0); NITER = 5; % number of random designs generated in stk_sampling_maximinlhs() xi = stk_sampling_maximinlhs (ni, DIM, BOX, NITER); % evaluation points zi = stk_feval (f, xi); % evaluation results if NOISY, zi = zi + noise_std * randn (ni, 1); end model = stk_model ('stk_materncov_iso'); if ~ NOISY, % Noiseless case: set a small "regularization" noise % the (log)variance of which is provided by stk_param_init model.lognoisevariance = 1e-10; else % Otherwise, set the variance of the noise % (assumed to be known, not estimated, in this example) model.lognoisevariance = 2 * log (noise_std); end % Estimate the parameters model.param = stk_param_estim (model, xi, zi, log ([1.0; 4.0; 1/0.4])); end stk/inst/misc/benchmarks/stk_benchmark_predict.m0000644000000000000000000000453513156161544017312 0ustar % STK_BENCHMARK_PREDICT Benchmark stk_predict % Copyright Notice % % Copyright (C) 2017 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function t_out = stk_benchmark_predict () nrep = 100; n_obs_list = [1 10 100]; n_prd_list = [1 10 100 1000]; [n_obs, n_prd] = ndgrid (n_obs_list, n_prd_list); m = numel (n_obs); t = zeros (nrep, m); M_prior = test_A_init (); for i = 1:m fprintf ('i = %d/%d...\n', i, m); testfun = @() test_A (M_prior, n_obs(i), n_prd(i)); t(:, i) = stk_benchmark_ (testfun, 1, nrep); end % Express results in ms t = t * 1000; t_out = stk_dataframe (zeros (m, 2), {'median', 'mad'}); for i = 1:m t_out.rownames{i} = sprintf ('% 4d /% 4d', n_obs(i), n_prd(i)); t_out.median(i) = median (t(:, i)); t_out.mad(i) = median (abs (t(:, i) - t_out.median(i))); end % Boxplots (if available) h_fig = stk_figure ('stk_benchmark_predict'); try boxplot (log10 (t * 1000)); set(gca (), 'xticklabel', t_out.rownames); stk_labels ('n_{obs} / n_{pred}', 'log10 (t) [ms]'); catch close (h_fig); end end % function function M_prior = test_A_init () % M_prior = stk_model ('stk_materncov32_iso'); % M_prior.param = [0; 0]; % This works even in very releases of STK M_prior = stk_model (); M_prior.covariance_type = 'stk_materncov32_iso'; M_prior.param = [0; 0]; end % function function z_prd = test_A (M_prior, n_obs, n_prd) x_obs = (linspace (0, 1, n_obs))'; z_obs = sin (x_obs); x_prd = rand (n_prd, 1); z_prd = stk_predict (M_prior, x_obs, z_obs, x_prd); end stk/inst/misc/design/0000755000000000000000000000000013156161544011734 5ustar stk/inst/misc/design/stk_maxabscorr.m0000644000000000000000000000472513156161544015144 0ustar % STK_MAXABSCORR computes the maximal absolute correlation for a set of points % % CALL: MAC = stk_maxabscorr (X) % % computes the Maximum Absolute (linear) Correlation MAC between the columns % of the array X. % % NOTES: % % * The construction of experimental designs (more specifically, Latin % hypercubes samples) with a small MAC is considered, e.g., by Florian % (1992) and Cioppa & Lucas (2007). % % * When X is a Latin hypercube sample, the linear (Pearson) correlation % coefficients and Spearman's rank correlation coefficients coincide. % % REFERENCES % % [1] Ales Florian, "An Efficient Sampling Scheme: Updated Latin Hypercube % Sampling", Probabilistic Engineering Mechanics, 7:123-130, 1992. % http://dx.doi.org/10.1016/0266-8920(92)90015-A % % [2] Thomas M. Cioppa and Thomas W. Lucas, "Efficient Nearly Orthogonal and % Space-Filling Latin Hypercubes, Technometrics, 49:1, 45-55, 2007. % http://dx.doi.org/10.1198/004017006000000453 % % See also: stk_mindist, stk_filldist, stk_phipcrit % Copyright Notice % % Copyright (C) 2015 CentraleSupelec % Copyright (C) 2013 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function mac = stk_maxabscorr (x) if nargin > 1 stk_error ('Too many input arguments.', 'TooManyInputArgs'); end x = double (x); x = bsxfun (@minus, x, mean (x)); n = size (x, 2); M = 0; for i = 1:(n-1) for j = (i+1):n M = max (M, abs (sum (x(:, i) .* x(:, j)))); end end mac = M / n; end % function %!assert (stk_isequal_tolabs (0.0, ... % Test on an OLHS(5) %! stk_maxabscorr ([0.4 0.8 0 -0.4 -0.8; -0.8 0.4 0 0.8 -0.4]'))); stk/inst/misc/design/stk_phipcrit.m0000644000000000000000000000760213156161544014622 0ustar % STK_PHIPCRIT computes the "phi_p" criterion of Morris & Mitchell % % CALL: D = stk_phipcrit (X, P) % % computes the phi_P criterion on the set of points X, which is defined for % an n x d array X as % % D = (sum_{1 <= i < j <= n} d_ij ^ (-p)) ^ (1/p) % % where d_ij is the Euclidean distance in R^d between X(i,:) and X(j,:). % % CALL: D = stk_phipcrit (X) % % computes the phi_P criterion with P = 50. % % NOTES: % % * In the special case P = 2, this criterion has first been introduced by % Audze & Eglais (1977). % % * When p -> +Inf, the value of the phi_p criterion tends to the inverse of % the mindist criterion. The phi_p criterion with a high value of p is % often used in place of the mindist criterion for its being easier to % optimize. Morris & Mitchell recommend using p in the range 20-50 for this % purpose. % % REFERENCES % % [1] Max D. Morris and Toby J. Mitchell, "Exploratory Designs for Computer % Experiments", Journal of Statistical Planning and Inference, % 43(3):381-402, 1995. % % [2] P. Audze and V. Eglais, "New approach for planning out experiments", % Problems of Dynamics and Strengths, 35:104-107, 1977. % % [3] Luc Pronzato and Werner G. Muller, "Design of computer % experiments: space filling and beyond", Statistics and Computing, % 22(3):681-701, 2012. % % [4] G. Damblin, M. Couplet and B. Iooss, "Numerical studies of space filling % designs: optimization of Latin hypercube samples and subprojection % properties", Journal of Simulation, in press. % % See also: stk_mindist, stk_filldist % Copyright Notice % % Copyright (C) 2017 CentraleSupelec % Copyright (C) 2013, 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function phi = stk_phipcrit (x, p) if nargin > 2 stk_error ('Too many input arguments.', 'TooManyInputArgs'); end if nargin < 2, p = 50; end % compute the distance matrix D = stk_dist (x); % compute mindist D = D + diag (inf (1, size (x, 1))); z = min (D(:)); % compute the value of the criterion if z > 0 tmp = triu ((D / z) .^ (-p), 1); phi = 1 / z * sum(tmp(:)) .^ (1/p); else phi = Inf; end end % function %!shared x %! x = [0, 0.2, 0.4, 0.6, 0.8, 1.0; %! 0, 0.6, 0.8, 1.0, 0.2, 0.4]'; %!assert (stk_isequal_tolabs ... %! (stk_phipcrit (x, 10), 3.946317664423303, 1e-15)) %!assert (stk_isequal_tolabs ... %! (stk_phipcrit (x, 50), 3.614077252813102, 1e-15)); %!assert (stk_isequal_tolabs ... %! (stk_phipcrit (x, 100), 3.574589859827413, 1e-15)); %!assert (stk_isequal_tolabs ... %! (stk_phipcrit (x, 1e9), 1 / stk_mindist (x), 1e-8)); %!assert (isequal (stk_phipcrit (ones (2)), Inf)); % library (DiceDesign) # load DiceDesign 1.2 % options (digits = 16) # display 16 significat digits % % x <- data.frame (x1 = c(0, 0.2, 0.4, 0.6, 0.8, 1.0), % x2 = c(0, 0.6, 0.8, 1.0, 0.2, 0.4)) % % phiP (x, 10) # 3.946317664423303 % phiP (x, 50) # 3.614077252813102 % phiP (x, 100) # 3.574589859827413 % phiP (x, 1000) # Inf, but we can do better stk/inst/misc/dist/0000755000000000000000000000000013156161544011426 5ustar stk/inst/misc/dist/stk_dist.m0000644000000000000000000000650013156161544013431 0ustar % STK_DIST computes a matrix of (Euclidean) distances % % CALL: D = stk_dist(X, Y) % % computes the matrix of distances between X and Y. More precisely, if % X is an nX x d matrix, and Y an nY x d matrix, the D is an nX x nY % matrix with % % D_{i,j} = norm(X(i,:) - Y(j,:)), % % where norm(.) denotes the Euclidean norm in R^d. % % See also: stk_mindist, stk_filldist, norm % Copyright Notice % % Copyright (C) 2012, 2013 SUPELEC % % Authors: Julien Bect % Emmanuel Vazquez % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function D = stk_dist(x, y, pairwise) if nargin > 3, stk_error ('Too many input arguments.', 'TooManyInputArgs'); end % read argument #1 x = double(x); % read argument #2 if nargin < 2, y = []; else y = double(y); end % read argument #3 if nargin < 3, pairwise = false; else if ~islogical(pairwise) errmsg = 'Argument ''pairwise'' should be either true or false.'; stk_error(errmsg, 'TypeMismatch'); end end if pairwise, if isempty(y), D = zeros(size(x, 1), 1); else D = __stk_dist_pairwise__ (x, y); %D = sqrt (sum ((x - y) .^ 2, 2)); % The MEX-file is usually faster end else if isempty(y), D = __stk_dist_matrixx__(x); else D = __stk_dist_matrixy__(x, y); end end end % function %% % Check that an error is raised in nargin is neither 1 nor 2 %!error stk_dist(); %!error stk_dist(0, 0, 0); %!error stk_dist(0, 0, 0, 0); %% % Check that an error is raised when the number of columns differs %!error stk_dist(0, ones(1, 2)); %!error stk_dist(eye(3), ones(1, 2)); %!error stk_dist(ones(2, 1), zeros(2)); %% % Test with some simple matrices %!shared x, y, z %! x = zeros(11, 5); %! y = zeros(13, 5); %! z = ones(7, 5); %!test %! Dx = stk_dist(x); %! assert(isequal(Dx, zeros(11))); %!test %! Dxx = stk_dist(x, x); %! assert(isequal(Dxx, zeros(11))); %!test %! Dxy = stk_dist(x, y); %! assert(isequal(Dxy, zeros(11, 13))); %!test %! Dzz = stk_dist(z, z); %! assert(isequal(Dzz, zeros(7))); %!test %! Dxz = stk_dist(x, z); %! assert(stk_isequal_tolabs(Dxz, sqrt(5)*ones(11, 7))); %!test %! x = randn(5,3); %! y = randn(5,3); %! D1 = stk_dist(x, y, true); % pairwise %! D2 = stk_dist(x, y); %! assert(stk_isequal_tolabs(D1, diag(D2))); %!test %! x = randn(5,3); %! D1 = stk_dist(x, [], true); % pairwise %! assert(stk_isequal_tolabs(D1, zeros(5, 1))); %! D1 = stk_dist(x, x, true); % pairwise %! assert(stk_isequal_tolabs(D1, zeros(5, 1))); stk/inst/misc/dist/stk_filldist.m0000644000000000000000000001353213156161544014303 0ustar % STK_FILLDIST computes the fill distance of a set of points % % CALL: FD = stk_filldist(X, BOX) % % computes the fill distance FD of the dataset X in the hyper-rectangle % BOX, using the computational-geometric algorithm of L. Pronzato and % W. G. Muller [1]. Recall that % % D = max_{Y in BOX} min_{1 <= i <= n} norm(X(i,:) - Y), (1) % % where norm(.) denotes the Euclidean norm in R^d. Optimal designs with % respect to the fill distance are sometimes called "minimax" designs % (see, e.g., [2]). % % CALL: FD = stk_filldist(X) % % assumes that the fill distance is to be computed with respect to the % hyperrectangle BOX = [0; 1]^d. % % CALL: FD = stk_filldist(X, Y) % % computes the fill distance FD of X using the "test set" Y. More preci- % sely, if X and Y are respectively n x d and m x d, then % % FD = max_{1 <= j <= m} min_{1 <= i <= n} norm(X(i,:) - Y(j,:)), % % If Y is dense enough in some subset BOX of R^d, then FD should be close % to the actual fill distance of X in BOX. % % CALL: [FD, YMAX] = stk_filldist(...) % % also returns the point YMAX where the maximal distance is attained. % % NOTE: % % stk_filldist is actually a wrapper around stk_filldist_discretized and % stk_filldist_exact. Which function to call is guessed based on the number % of rows of the second argument. Because of that, the test set Y is required % to have at least 3 rows. % % REFERENCES % % [1] Luc Pronzato and Werner G. Muller, "Design of computer % experiments: space filling and beyond", Statistics and Computing, % 22(3):681-701, 2012. % % [2] Mark E. Johnson, Leslie M. Moore and Donald Ylvisaker, "Minimax % and maximin distance designs", Journal of Statistical Planning % and Inference, 26(2):131-148, 1990. % % See also: stk_dist, stk_mindist, stk_filldist_exact, stk_filldist_discretized % Copyright Notice % % Copyright (C) 2013 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function [fd, ymax] = stk_filldist(x, arg2) if nargin > 2, stk_error ('Too many input arguments.', 'TooManyInputArgs'); end x = double(x); if nargin == 1, % defaults: "exact" over [0; 1]^d default_box = repmat([0; 1], 1, size(x, 2)); fd = stk_filldist_exact(x, default_box); else arg2 = double(arg2); ny = size(arg2, 1); if ny == 2, % arg2 is interpreted as a box [fd, ymax] = stk_filldist_exact(x, arg2); elseif ny > 2, % arg2 is interpreted a discrete test set [fd, idx_max] = __stk_filldist_discr_mex__(x, arg2); ymax = arg2(idx_max, :); else errmsg = 'Incorrect size for argument #2: nb rows > 1 expected.'; stk_error(errmsg, 'InvalidArgument'); end end % if end % function %% % Check that both double-precision matrices and stk_dataframe objects are accepted %!test %%% exact %! d = 3; x = rand(7, d); box = repmat([0; 1], 1, d); %! fd1 = stk_filldist(x, box); %! fd2 = stk_filldist(stk_dataframe(x), stk_dataframe(box)); %! assert(stk_isequal_tolabs(fd1, fd2)); %!test %%% discretized %! d = 3; x = rand(7, d); y = rand(20, d); %! fd1 = stk_filldist(x, y); %! fd2 = stk_filldist(stk_dataframe(x), stk_dataframe(y)); %! assert(stk_isequal_tolabs(fd1, fd2)); %% % fd = 0 if X = Y (discretized filldist) %!test %! n = 5; % must be bigger than 2 %! for dim = 1:10, %! x = rand(n, dim); %! fd = stk_filldist(x, x); %! assert(stk_isequal_tolabs(fd, 0.0)); %! end %% % One point in the middle of [0; 1]^d (exact & discretized filldist) %!test %%% exact %! for dim = 1:6, %! x = 0.5 * ones(1, dim); %! fd = stk_filldist(x); % [0; 1]^d is the default box %! assert(stk_isequal_tolabs(fd, 0.5 * sqrt(dim))); %! end %!test %%% discretized %! for dim = 1:6, %! x = 0.5 * ones(1, dim); %! y = stk_sampling_regulargrid(2^dim, dim); % [0; 1]^d is the default box %! fd = stk_filldist(x, y); %! assert(stk_isequal_tolabs(fd, 0.5 * sqrt(dim))); %! end %% % One point in the middle of [1; 2]^d (exact filldist) %!test %! for dim = [1 3 7], %! box = repmat([1; 2], 1, dim); %! x = 1 + 0.5 * ones(1, dim); %! fd = stk_filldist(x, box); %! assert(stk_isequal_tolabs(fd, 0.5 * sqrt(dim))); %! end %% % 20 points in [-1; 1]^3 %!test %! dim = 3; %! box = repmat([-1; 1], 1, dim); %! x = stk_sampling_randunif(20, dim, box); %! y = stk_sampling_regulargrid(3^dim, dim, box); %! fd1 = stk_filldist(x, box); %! fd2 = stk_filldist(x, y); %! assert(fd1 >= fd2 - 10 * eps); %% % One point at the origin, BOX = [0; 1]^d %!test %%% exact %! for dim = [1 3 7], %! x = zeros(1, dim); %! [fd, ymax] = stk_filldist_exact(x); %! assert(stk_isequal_tolabs(fd, sqrt(dim))); %! assert(stk_isequal_tolabs(ymax, ones(1, dim))); %! end %!test %%% discretized %! for dim = [1 3 7], %! x = zeros(1, dim); %! y = stk_sampling_regulargrid(3^dim, dim); %! [fd, ymax] = stk_filldist(x, y); %! assert(stk_isequal_tolabs(fd, sqrt(dim))); %! assert(stk_isequal_tolabs(ymax, ones(1, dim))); %! end stk/inst/misc/dist/stk_filldist_discretized.m0000644000000000000000000001025613156161544016674 0ustar % STK_FILLDIST_DISCRETIZED computes the (discrete) fill distance of a set of points % % CALL: FD = stk_filldist_discretized(X, Y) % % computes the fill distance FD of X using the "test set" Y. More precisely, if % X and Y are respectively n x d and m x d, then % % FD = max_{1 <= j <= m} min_{1 <= i <= n} norm(X(i,:) - Y(j,:)), % % where norm(.) denotes the Euclidean norm in R^d. If Y is dense enough in some % subset BOX of R^d, then FD should be close to the actual fill distance of X in % BOX (see: stk_filldist_exact). Optimal designs with respect to the fill distance % are sometimes called "minimax" designs (see, e.g., [1]). % % CALL: [D, ARGMAX] = stk_filldist_discretized(X, Y) % % also returns the value ARGMAX of the index j for which the maximum is attained. % (If the maximum is obtained for several values of j, the smallest is returned.) % % REFERENCE % % [1] Mark E. Johnson, Leslie M. Moore and Donald Ylvisaker, "Minimax % and maximin distance designs", Journal of Statistical Planning % and Inference, 26(2):131-148, 1990. % % See also: stk_filldist, stk_filldist_exact, stk_dist, stk_mindist % Copyright Notice % % Copyright (C) 2012, 2013 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function [fd, ymax] = stk_filldist_discretized(x, y) if nargin > 2, stk_error ('Too many input arguments.', 'TooManyInputArgs'); end x = double(x); y = double(y); % call MEX-file [fd, idx_max] = __stk_filldist_discr_mex__(x, y); ymax = y(idx_max, :); end % function %% % Two non-empty matrices are expected as input arguments %!error stk_filldist_discretized(0.0) % incorrect nb of arguments %!error stk_filldist_discretized(0.0, 0.0, pi) % incorrect nb of arguments %!error stk_filldist_discretized(0.0, []) % second arg is empty %!error stk_filldist_discretized([], 0.0) % first arg is empty %% % Check that both double-precision matrices and stk_dataframe objects are accepted %!test %! d = 3; x = rand(7, d); y = rand(20, d); %! fd1 = stk_filldist_discretized(x, y); %! fd2 = stk_filldist_discretized(stk_dataframe(x), stk_dataframe(y)); %! assert(stk_isequal_tolabs(fd1, fd2)); %% % fd = 0 if X = Y %!test %! n = 5; %! for dim = 1:10, %! x = rand(n, dim); %! fd = stk_filldist_discretized(x, x); %! assert(stk_isequal_tolabs(fd, 0.0)); %! end %% % fd = norm if nx = ny = 1 %!test %! for dim = 1:10, %! x = rand(1, dim); %! y = rand(1, dim); %! fd = stk_filldist_discretized(x, y); %! assert(stk_isequal_tolabs(fd, norm(x - y))); %! end %% % Filldist = max(dist) if ny = 1 %!test %! n = 4; %! for dim = 2:10, %! x = zeros(n, dim); %! y = rand(1, dim); %! fd = stk_filldist_discretized(x, y); %! assert(stk_isequal_tolabs(fd, max(stk_dist(x, y)))); %! end %% % One point in the middle of [0; 1]^d %!test %! for dim = [1 3 6], %! x = 0.5 * ones(1, dim); %! y = stk_sampling_regulargrid(2^dim, dim); % [0; 1]^d is the default box %! fd = stk_filldist_discretized(x, y); %! assert(stk_isequal_tolabs(fd, 0.5 * sqrt(dim))); %! end %% % One point at the origin, BOX = [0; 1]^d %!test %! for dim = [1 3 7], %! x = zeros(1, dim); %! y = stk_sampling_regulargrid(3^dim, dim); %! [fd, ymax] = stk_filldist_discretized(x, y); %! assert(stk_isequal_tolabs(fd, sqrt(dim))); %! assert(stk_isequal_tolabs(ymax, ones(1, dim))); %! end stk/inst/misc/dist/stk_filldist_exact.m0000644000000000000000000001416713156161544015474 0ustar % STK_FILLDIST_EXACT computes the (exact) fill distance of a set of points % % CALL: FD = stk_filldist_exact(X, BOX) % % computes the fill distance FD of the dataset X in the hyper-rectangle % BOX, using the computational-geometric algorithm of L. Pronzato and % W. G. Muller [1]. Recall that % % D = max_{Y in BOX} min_{1 <= i <= n} norm(X(i,:) - Y), (1) % % where norm(.) denotes the Euclidean norm in R^d. Optimal designs with % respect to the fill distance are sometimes called "minimax" designs % (see, e.g., [2]). % % CALL: FD = stk_filldist_exact(X) % % assumes that the fill distance is to be computed with respect to the % hyperrectangle BOX = [0; 1]^d. % % CALL: [FD, YMAX] = stk_filldist_exact(...) % % also returns the point YMAX where the maximal distance is attained, % i.e., the argmax in equation (1). % % REFERENCES % % [1] Luc Pronzato and Werner G. Muller, "Design of computer % experiments: space filling and beyond", Statistics and Computing, % 22(3):681-701, 2012. % % [2] Mark E. Johnson, Leslie M. Moore and Donald Ylvisaker, "Minimax % and maximin distance designs", Journal of Statistical Planning % and Inference, 26(2):131-148, 1990. % % See also: stk_filldist, stk_filldist_discretized, stk_dist, stk_mindist % Copyright Notice % % Copyright (C) 2013 SUPELEC, Guillaume Carlier & Florian Pasanisi % % Authors: Julien Bect % Florian Pasanisi % and Guillaume Carlier % % Maintainer: Julien Bect % % Guillaume Carlier and Florian Pasanisi wrote a first implementation % of the algorithm following the paper of Pronzato & Muller (2011), % which was subsequently streamlined and adapted to the STK toolbox % by Julien Bect. % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function [fd, ymax] = stk_filldist_exact(x, box) %--------------------------------------- if nargin > 2, stk_error ('Too many input arguments.', 'TooManyInputArgs'); end x = double(x); [n, d] = size(x); if nargin == 1, box = repmat([0; 1], 1, d); else box = double(box); end %--- Construct a triangulation that covers [0; 1]^d ------------------------------------- x = add_symm(x, box); % extend using symmetries with respect to the faces % 2013/03/13: at the present time, Octave doesn't have the 'stable' option % (but, fortunately, we don't really care about doing a STABLE sort here...) % remove duplicates to avoid a a warning in delaunayn() x = unique(x, 'rows'); dt = delaunayn(x); % Delaunay trianulation nt = length(dt(:, 1)); % number of triangles %--- Compute centers and radiuses ------------------------------------------------------- center = zeros(nt, d); % prepare for computing the centers rsquared = zeros(nt, 1); % prepare for computing the (squared) radiuses for i = 1:nt, Z = x(dt(i, :), :); % vertices of the simplex W = sum(Z.^2, 2); % squared norms C = repmat(Z(1, :), d, 1) - Z(2:end, :); B = (W(1) - W(2:end))/2; center(i, :) = transpose(C\B); rsquared(i, 1) = sum(center(i,:).^2) + W(1) - 2 * Z(1, :) * center(i, :)'; end %--- Find the simplices for which the center is (almost) inside the box ----------------- % enlarge box for numerical tolerance TOLERANCE = 1e-10; bbox = box + TOLERANCE * [-1; 1] * diff(box); inside = true(size(center, 1), 1); for j = 1:d, inside = inside & (center(:, j) >= bbox(1, j)) ... & (center(:, j) <= bbox(2, j)) ; end %--- Grand finale ----------------------------------------------------------------------- % maximal radius for centers that are almost inside the box [rsquared_max, idx_max] = max(rsquared .* double(inside)); % project on the box ymax = max(min(center(idx_max, :), box(2, :)), box(1, :)); % fill distance fd = sqrt(rsquared_max); % safety net if isinf(fd) || any(isnan(ymax)), errmsg = 'This is surprising... How did I get here ???'; stk_error(errmsg, 'AlgorithmFailure'); end end % function %%%%%%%%%%%%%%% % add_sym % %%%%%%%%%%%%%%% function y = add_symm(x, box) %---------------------------------------------------------- [n d] = size(x); k = 2 * d + 1; y = repmat(x, k, 1); for j = 1:d y(n*j+1:(j+1)*n, j) = 2 * box(1, j) - x(1:n, j); y((k-j)*n+1:(k+1-j)*n, j) = 2 * box(2, j) - x(1:n, j); end end % function %% % Check that both double-precision matrices and stk_dataframe objects are accepted %!test %! d = 3; x = rand(7, d); box = repmat([0; 1], 1, d); %! fd1 = stk_filldist_exact(x, box); %! fd2 = stk_filldist_exact(stk_dataframe(x), stk_dataframe(box)); %! assert(stk_isequal_tolabs(fd1, fd2)); %% % One point in the middle of [0; 1]^d %!test %! for dim = 1:6, %! x = 0.5 * ones(1, dim); %! fd = stk_filldist_exact(x); % [0; 1]^d is the default box %! assert(stk_isequal_tolabs(fd, 0.5 * sqrt(dim))); %! end %% % One point in the middle of [1; 2]^d %!test %! for dim = [1 3 7], %! box = repmat([1; 2], 1, dim); %! x = 1 + 0.5 * ones(1, dim); %! fd = stk_filldist_exact(x, box); %! assert(stk_isequal_tolabs(fd, 0.5 * sqrt(dim))); %! end %% % One point at the origin, BOX = [0; 1]^d %!test %! for dim = [1 3 7], %! x = zeros(1, dim); %! [fd, ymax] = stk_filldist_exact(x); %! assert(stk_isequal_tolabs(fd, sqrt(dim))); %! assert(stk_isequal_tolabs(ymax, ones(1, dim))); %! end stk/inst/misc/dist/stk_gpquadform.m0000644000000000000000000001126713156161544014641 0ustar % STK_GPQUADFORM [experimental, not part of public API yet... UAYOR!] % % CALL: Q = stk_gpquadform (X, Y, RX, RY) % % computes a matrix Q, whose entries Q(i,j) are given by a Gibbs- % Paciorek quadratic form % % Q(i,j) = \sum_{k = 1}^d (X(i,k) - Y(j,k))^2 / R(i,j,k)^2, % % where % % R(i,j,k)^2 = RX(i,k)^2 + RY(i,k)^2, % % assuming that % % * X and RX have size [nX d], % * Y and RY have size [nY d]. % Copyright Notice % % Copyright (C) 2017 CentraleSupelec % Copyright (C) 2013, 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function Q = stk_gpquadform (x, y, rx, ry, pairwise) if nargin > 5 stk_error ('Too many input arguments.', 'TooManyInputArgs'); end % read argument #4 if nargin < 4 if isempty (y) ry = rx; else errmsg = 'Not enough input arguments.'; stk_error (errmsg, 'NotEnoughInputArgs'); end else if (isempty (y)) && (~ isempty (ry)) && (~ isequal (rx, ry)) errmsg = 'ry should be empty or equal to rx'; stk_error (errmsg, 'InvalidArgument'); end end % read argument #5 if nargin < 5 pairwise = false; else if ~ islogical (pairwise) errmsg = 'Argument ''pairwise'' should be either true or false.'; stk_error (errmsg, 'TypeMismatch'); end end if pairwise, if isempty (y), Q = zeros (size (x, 1), 1); else Q = __stk_gpquadform_pairwise__ (x, y, rx, ry); end else if isempty (y), Q = __stk_gpquadform_matrixx__ (x, rx); else Q = __stk_gpquadform_matrixy__ (x, y, rx, ry); end end end % function %%%%%%%%% % TESTS % %%%%%%%%% %!shared x, y, z, rx, ry, rz %! x = rand(5, 2); rx = rand(5, 2) + 1; %! y = rand(6, 2); ry = rand(6, 2) + 1; %! z = rand(5, 3); rz = rand(5, 3) + 1; %% % Check that an error is raised when sizes are incompatible %!error Q = stk_gpquadform(x, ry, y, ry) %!error Q = stk_gpquadform(x, rz, y, ry) %!error Q = stk_gpquadform(x, rx, y, rx) %!error Q = stk_gpquadform(x, rx, y, rz) %!error Q = stk_gpquadform(x, rx, z, ry) %% % Tests with r = 1/sqrt(2) %!shared x, y, z, rx, ry, rz %! x = zeros (11, 5); rx = 1/sqrt(2) * ones (11, 5); %! y = zeros (13, 5); ry = 1/sqrt(2) * ones (13, 5); %! z = ones ( 7, 5); rz = 1/sqrt(2) * ones ( 7, 5); %!test %! Qx = stk_gpquadform(x, [], rx); %! assert(isequal(Qx, zeros(11))); %!test %! Qxx = stk_gpquadform(x, x, rx, rx); %! assert(isequal(Qxx, zeros(11))); %!test %! Qxy = stk_gpquadform(x, y, rx, ry); %! assert(isequal(Qxy, zeros(11, 13))); %!test %! Qzz = stk_gpquadform(z, [], rz); %! assert(isequal(Qzz, zeros(7))); %!test %! Qxz = stk_gpquadform(x, z, rx, rz); %! assert(stk_isequal_tolabs(Qxz, 5 * ones(11, 7))); %% % Tests with a random r %!test %! x = randn(5, 3); rx = 1 + rand(5, 3); %! y = randn(5, 3); ry = 1 + rand(5, 3); %! Q1 = stk_gpquadform(x, y, rx, ry, true); % pairwise %! Q2 = stk_gpquadform(x, y, rx, ry, false); %! assert(isequal(size(Q1), [5 1])); %! assert(isequal(size(Q2), [5 5])); %! assert(stk_isequal_tolabs(Q1, diag(Q2))); %!test %! x = randn(5, 3); rx = 1 + rand(5, 3); %! Q1 = stk_gpquadform(x, [], rx, [], true); % pairwise %! assert(stk_isequal_tolabs(Q1, zeros(5, 1))); %! Q1 = stk_gpquadform(x, x, rx, rx, true); % pairwise %! assert(stk_isequal_tolabs(Q1, zeros(5, 1))); %% % Tests with r = 2 %!shared x, y, z, rx, ry, rz %! x = zeros (11, 5); rx = 2 * ones (11, 5); %! y = zeros (13, 5); ry = 2 * ones (13, 5); %! z = ones ( 7, 5); rz = 2 * ones ( 7, 5); %!test %! Qx = stk_gpquadform(x, [], rx); %! assert(isequal(Qx, zeros(11))); %!test %! Qxx = stk_gpquadform(x, x, rx, rx); %! assert(isequal(Qxx, zeros(11))); %!test %! Qxy = stk_gpquadform(x, y, rx, ry); %! assert(isequal(Qxy, zeros(11, 13))); %!test %! Qzz = stk_gpquadform(z, [], rz); %! assert(isequal(Qzz, zeros(7))); %!test %! Qxz = stk_gpquadform(x, z, rx, rz); %! assert(stk_isequal_tolabs(Qxz, 5/8 * ones(11, 7))); stk/inst/misc/dist/stk_mindist.m0000644000000000000000000000557113156161544014144 0ustar % STK_MINDIST computes the separation distance of a set of points % % CALL: D = stk_mindist(X) % % computes the separation distance D of X. More precisely, if X is an % n x d matrix, then % % D = min_{1 <= i < j <= n} norm(X(i,:) - X(j,:)), % % where norm(.) denotes the Euclidean norm in R^d. % % See also: stk_dist, stk_filldist % Copyright Notice % % Copyright (C) 2012, 2013 SUPELEC % % Authors: Julien Bect % Emmanuel Vazquez % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function md = stk_mindist(x) if nargin > 1, stk_error ('Too many input arguments.', 'TooManyInputArgs'); end % call MEX-file md = __stk_mindist_mex__(double(x)); end % function %% % Check that both double-precision matrices and stk_dataframe objects are accepted %!test %! d = 3; x = rand(7, d); %! md1 = stk_mindist(x); %! md2 = stk_mindist(stk_dataframe(x)); %! assert(stk_isequal_tolabs(md1, md2)); %% % Check that sk_mindist(x) is empty when x has zero lines %!test %! for nc = [0 5 10], %! x = zeros(0, nc); %! d = stk_mindist(x); %! assert(isempty(d)); %! end %% % Check that sk_mindist(x) is empty when x has only one line. %!test %! for nc = [0 5 10], %! x = rand(1, nc); %! d = stk_mindist(x); %! assert(isempty(d)); %! end %% % Check that sk_mindist(x) is 0.0 when x has 0 columns (but at least 2 lines) %!test %! for nr = [2 5 10], %! x = zeros(nr, 0); %! d = stk_mindist(x); %! assert(isequal(d, 0.0)); %! end %% % Random matrices with at least 2 lines and 1 column %!test %! %! nrep = 20; %! TOL_REL = 1e-15; %! %! for irep = 1:nrep, %! %! n = 2 + floor(rand * 10); %! d = 1 + floor(rand * 10); %! x = rand(n, d); %! z = stk_mindist(x); %! %! assert(isequal(size(d), [1, 1])); %! assert(~isnan(d)); %! assert(~isinf(d)); %! %! % check the result %! mindist = Inf; %! for i = 1:(n-1), %! for j = (i+1):n, %! mindist = min(mindist, norm(x(i,:) - x(j,:))); %! end %! end %! assert(abs(z - mindist) <= TOL_REL * mindist); %! %! end stk/inst/misc/distrib/0000755000000000000000000000000013156161544012123 5ustar stk/inst/misc/distrib/stk_distrib_bivnorm_cdf.m0000644000000000000000000001253413156161544017177 0ustar % STK_DISTRIB_BIVNORM_CDF [STK internal] % Copyright Notice % % Copyright (C) 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function [p, q] = stk_distrib_bivnorm_cdf (z, mu1, mu2, sigma1, sigma2, rho) if nargin > 6, stk_error ('Too many input arguments.', 'TooManyInputArgs'); end %--- Split z into [z1, z2] ----------------------------------------------------- s = size (z); if s(end) ~= 2 stk_error (['Incorrect size: expecting an array with length 2 ' ... 'on its last dimension.'], 'IncorrectSize'); end S = struct ('type', '()', 'subs', {repmat({':'}, size(s))}); S.subs{end} = 1; z1 = subsref (z, S); S.subs{end} = 2; z2 = subsref (z, S); %--- Substract the means ------------------------------------------------------- if ~ isequal (mu1, 0) z1 = bsxfun (@minus, z1, mu1); end if ~ isequal (mu2, 0) z2 = bsxfun (@minus, z2, mu2); end %--- Bring everything to a common size ----------------------------------------- if ~ isequal (size (z1), size (z2), size (sigma1), size (sigma2), size (rho)) [z1, z2, sigma1, sigma2, rho] = stk_commonsize ... (z1, z2, sigma1, sigma2, rho); end p = nan (size (z1)); q = nan (size (z1)); %--- Deal with special cases --------------------------------------------------- b1 = (sigma1 == 0.0); if any (b1) % First component is zero a.s. [p(b1) q(b1)] = handle_singular_case (b1, z1, z2, sigma2); end b2 = (~ b1) & (sigma2 == 0.0); if any (b2) % Second component is zero a.s. [p(b2) q(b2)] = handle_singular_case (b2, z2, z1, sigma1); end %--- Deal with the general case ------------------------------------------------ b0 = ~ (b1 | b2); if any (b0) z1 = z1(b0) ./ sigma1(b0); z2 = z2(b0) ./ sigma2(b0); [p(b0), q(b0)] = __stk_distrib_bivnorm0_cdf__ ([z1 z2], rho(b0)); end end % function function [p q] = handle_singular_case (b1, z1, z2, sigma2) z1_ = z1(b1); z2_ = z2(b1); sigma2_ = sigma2(b1); % Values for the case z1 < 0 s = size (z1_); p = zeros (s); q = ones (s); b1p = (z1_ >= 0); if any (b1p) [p(b1p) q(b1p)] = stk_distrib_normal_cdf (z2_(b1p), 0, sigma2_(b1p)); end end % function %!test %! %! z1 = [0 1; -1 2]; %! z2 = [0 1; 1 -2]; %! %! z = cat (3, z1, z2); % 2 x 2 x 2 %! %! mu1 = 0; % 1 x 1 x 1 %! mu2 = [0 1]; % 1 x 2 x 1 %! %! sigma1 = [1 3]; % 1 x 2 x 1 %! sigma2 = [1; 2]; % 2 x 1 x 1 %! %! rho = [0; 0.5]; % 2 x 1 x 1 %! %! %% BROADCASTING => the result will be a 2 x 2 matrix %! %! p = stk_distrib_bivnorm_cdf (z, mu1, mu2, sigma1, sigma2, rho); %! %! p11 = 0.25; % mvncdf ([ 0 0], [0 0], [1 0; 0 1]); %! p12 = 0.315279329909118; % mvncdf ([ 1 1], [0 1], [9 0; 0 1]); %! p21 = 0.146208349559646; % mvncdf ([-1 1], [0 0], [1 1; 1 4]); %! p22 = 0.064656239880040; % mvncdf ([ 2 -2], [0 1], [9 3; 3 4]); %! %! assert (stk_isequal_tolabs (p, [p11 p12; p21 p22], 1e-14)) %%% [p, q] = stk_distrib_bivnorm_cdf ([inf z], 0, 0, 1, 1, 0) with various z's %!test %! [p, q] = stk_distrib_bivnorm_cdf ([inf -inf], 0, 0, 1, 1, 0); %! assert ((p == 0.0) && (q == 1.0)) %!test %! [p, q] = stk_distrib_bivnorm_cdf ([inf -10], 0, 0, 1, 1, 0); %! assert (stk_isequal_tolrel (p, 7.619853024160489e-24, 1e-12)) %! assert (q == 1.0) %!test %! [p, q] = stk_distrib_bivnorm_cdf ([inf 0], 0, 0, 1, 1, 0); %! assert (stk_isequal_tolrel (p, 0.5, 1e-12)) %! assert (stk_isequal_tolrel (q, 0.5, 1e-12)) %!test %! [p, q] = stk_distrib_bivnorm_cdf ([inf 10], 0, 0, 1, 1, 0); %! assert (p == 1.0); %! assert (stk_isequal_tolrel (q, 7.619853024160489e-24, 1e-12)) %!test %! [p, q] = stk_distrib_bivnorm_cdf ([inf inf], 0, 0, 1, 1, 0); %! assert ((p == 1.0) && (q == 0.0)) %%% [p, q] = stk_distrib_bivnorm_cdf ([z inf], 0, 0, 1, 1, 0) with various z's %!test %! [p, q] = stk_distrib_bivnorm_cdf ([-inf inf], 0, 0, 1, 1, 0); %! assert ((p == 0.0) && (q == 1.0)) %!test %! [p, q] = stk_distrib_bivnorm_cdf ([-10 inf], 0, 0, 1, 1, 0); %! assert (stk_isequal_tolrel (p, 7.619853024160489e-24, 1e-12)) %! assert (q == 1.0) %!test %! [p, q] = stk_distrib_bivnorm_cdf ([0 inf], 0, 0, 1, 1, 0); %! assert (stk_isequal_tolrel (p, 0.5, 1e-12)) %! assert (stk_isequal_tolrel (q, 0.5, 1e-12)) %!test %! [p, q] = stk_distrib_bivnorm_cdf ([10 inf], 0, 0, 1, 1, 0); %! assert (p == 1.0); %! assert (stk_isequal_tolrel (q, 7.619853024160489e-24, 1e-12)) %!test %! [p, q] = stk_distrib_bivnorm_cdf ([inf inf], 0, 0, 1, 1, 0); %! assert ((p == 1.0) && (q == 0.0)) %!test % A mixture of singular and non-singular cases %! p = stk_distrib_bivnorm_cdf ([0 0], 0, 0, [1; 0], 1, 0); %! assert (isequal (p, [0.25; 0.5])); stk/inst/misc/distrib/stk_distrib_normal_cdf.m0000644000000000000000000000642013156161544017010 0ustar % STK_DISTRIB_NORMAL_CDF [STK internal] % Copyright Notice % % Copyright (C) 2015 CentraleSupelec % Copyright (C) 2013, 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function [p, q] = stk_distrib_normal_cdf (z, mu, sigma) if nargin > 3, stk_error ('Too many input arguments.', 'TooManyInputArgs'); end if nargin > 1, z = bsxfun (@minus, z, mu); end if nargin < 3, sigma = 1; end if isscalar (sigma) if sigma > 0 z = z / sigma; k0 = false; k1 = true; elseif sigma == 0 k0 = true; k1 = false; else k0 = false; k1 = false; end else if ~ isequal (size (z), size (sigma)) [z, sigma] = stk_commonsize (z, sigma); end k0 = (sigma == 0); k1 = (sigma > 0); z(k1) = z(k1) ./ sigma(k1); end p = nan (size (z)); q = nan (size (z)); kp = (z >= 0); kz = ~ isnan (z); if any (k1) % sigma > 0 k1 = bsxfun (@and, k1, kz); k1n = k1 & (~ kp); k1p = k1 & kp; % Deal with positive values of x: compute q first, then p = 1 - q q_k1p = 0.5 * erfc (0.707106781186547524 * z(k1p)); q(k1p) = q_k1p; p(k1p) = 1 - q_k1p; % Deal with negative values of x: compute p first, then q = 1 - p p_k1n = 0.5 * erfc (- 0.707106781186547524 * z(k1n)); p(k1n) = p_k1n; q(k1n) = 1 - p_k1n; end if any (k0) % sigma == 0 k0 = bsxfun (@and, k0, kz); p_k0 = double (kp(k0)); p(k0) = p_k0; q(k0) = 1 - p_k0; end end % function %!assert (stk_isequal_tolrel (stk_distrib_normal_cdf ([1; 3], 1, [1 10]), ... %! [0.5, ... % normcdf ((1 - 1) / 1) %! 0.5; ... % normcdf ((1 - 1) / 10) %! 0.5 * erfc(-sqrt(2)), ... % normcdf ((3 - 1) / 1) %! 0.5 * erfc(-0.1*sqrt(2)) ... % normcdf ((3 - 1) / 10) %! ], eps)); %!test %! [p, q] = stk_distrib_normal_cdf (10); %! assert (isequal (p, 1.0)); %! assert (stk_isequal_tolrel (q, 7.6198530241604975e-24, eps)); %!assert (isequal (stk_distrib_normal_cdf ( 0.0), 0.5)); %!assert (isequal (stk_distrib_normal_cdf ( inf), 1.0)); %!assert (isequal (stk_distrib_normal_cdf (-inf), 0.0)); %!assert (isnan (stk_distrib_normal_cdf ( nan))); %!assert (isnan (stk_distrib_normal_cdf (0, 0, -1))); %!assert (isequal (stk_distrib_normal_cdf (0, 0, 0), 1.0)); %!assert (isequal (stk_distrib_normal_cdf (0, 1, 0), 0.0)); %!assert (isequal (stk_distrib_normal_cdf (1, 0, 0), 1.0)); stk/inst/misc/distrib/stk_distrib_normal_crps.m0000644000000000000000000001077713156161544017235 0ustar % STK_DISTRIB_NORMAL_CRPS computes the CRPS for Gaussian predictive distributions % % CALL: CRPS = stk_distrib_normal_crps (Z, MU, SIGMA) % % computes the Continuous Ranked Probability Score (CRPS) of Z with respect % to a Gaussian predictive distribution with mean MU and standard deviation % SIGMA. % % The CRPS is defined as the integral of the Brier score for the event % {Z <= z}, when z ranges from -inf to +inf: % % CRPS = int_{-inf}^{+inf} [Phi((z - MU)/SIGMA) - u(z - Z)]^2 dz, % % where Phi is the normal cdf and u the Heaviside step function. The CRPS % is equal to zero if, and only if, the predictive distribution is a Dirac % distribution (SIGMA = 0) and the observed value is equal to the predicted % value (Z = MU). % % REFERENCE % % [1] Tilmann Gneiting and Adrian E. Raftery, "Strictly proper scoring % rules, prediction, and estimation", Journal of the American % Statistical Association, 102(477):359-378, 2007. % % See also: stk_distrib_normal_cdf, stk_predict_leaveoneout % Copyright Notice % % Copyright (C) 2017 CentraleSupelec & LNE % % Authors: Remi Stroh % Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function crps = stk_distrib_normal_crps(z, mu, sigma) if nargin > 4 stk_error('Too many inputs arguments.', 'TooManyInputArgs'); end %% Center and reduce the data if nargin > 1 && ~ isempty (mu) delta = bsxfun (@minus, z, mu); % compute z - m else % Default: mu = 0; delta = z; end if nargin > 2 && ~ isempty (sigma) sigma(sigma < 0) = nan; else % Default: sigma = 1 sigma = 1; end % Check size [delta, sigma] = stk_commonsize (delta, sigma); %% Formula for CRPS crps = nan (size (delta)); b0 = ~ (isnan (delta) | isnan (sigma)); b1 = (sigma > 0); % Compute the CRPS where sigma > 0 b = b0 & b1; if any (b) u = delta(b) ./ sigma(b); % (z - m)/s crps(b) = sigma(b) .* (2 * stk_distrib_normal_pdf (u)... + u .* (2 * stk_distrib_normal_cdf (u) - 1)) - sigma(b) / (sqrt (pi)); end % Compute the CRPS where sigma == 0: CRPS = abs(z - mu) b = b0 & (~ b1); crps(b) = abs (delta(b)); % Correct numerical inaccuracies crps(crps < 0) = 0; end % Check particular values %!assert (stk_isequal_tolabs (stk_distrib_normal_crps (0.0, 0.0, 0.0), 0.0)) %!assert (stk_isequal_tolabs (stk_distrib_normal_crps (0.0, 0.0, 1.0), (sqrt(2) - 1)/sqrt(pi))) % Compute Continuous Ranked Probability Score (CRPS) %!shared n, x_obs, mu, sigma, crps, crps_exp %! x_obs = [ 1.78; -2.29; -1.62; -5.89; 2.88; 0.65; 2.74; -3.42]; % observations %! mu = [-0.31; -0.59; 1.48; -1.57; -0.05; -0.27; 1.05; 1.27]; % predictions %! sigma = [ 2.76; 6.80; 1.63; 1.19; 4.98; 9.60; 5.85; 2.24]; % standard dev %! n = size(x_obs, 1); %! crps = stk_distrib_normal_crps (x_obs, mu, sigma); %!assert (isequal (size (crps), [n, 1])) %!assert (all (crps >= 0)) %!assert (stk_isequal_tolabs (crps, stk_distrib_normal_crps(mu, x_obs, sigma))) %!assert (stk_isequal_tolabs (stk_distrib_normal_crps (x_obs, mu, 0), abs (x_obs - mu))) % % Numerical integration to get the reference results used below % crps_ref = nan (n, 1); % for k = 1:n % x1 = linspace (mu(k) - 6*sigma(k), x_obs(k), 2e6); % x2 = linspace (x_obs(k), mu(k) + 6*sigma(k), 2e6); % F1 = stk_distrib_normal_cdf (x1, mu(k), sigma(k)) .^ 2; % F2 = stk_distrib_normal_cdf (mu(k), x2, sigma(k)) .^ 2; % crps_ref(k) = trapz ([x1 x2], [F1 F2]); % end %! crps_ref = [ ... %! 1.247856605928301 ... %! 1.757798727719891 ... %! 2.216236225997414 ... %! 3.648696666764968 ... %! 1.832355265287495 ... %! 2.278618297947438 ... %! 1.560544734359158 ... %! 3.455697443411153 ]; %! assert (stk_isequal_tolabs (crps, crps_ref, 1e-10)); stk/inst/misc/distrib/stk_distrib_normal_ei.m0000644000000000000000000001051213156161544016646 0ustar % STK_DISTRIB_NORMAL_EI computes the normal (Gaussian) expected improvement % % CALL: EI = stk_distrib_normal_ei (Z) % % computes the expected improvement of a standard normal (Gaussian) % random variable above the threshold Z. % % CALL: EI = stk_distrib_normal_ei (Z, MU, SIGMA) % % computes the expected improvement of a Gaussian random variable % with mean MU and standard deviation SIGMA, above the threshold Z. % % CALL: EI = stk_distrib_normal_ei (Z, MU, SIGMA, MINIMIZE) % % computes the expected improvement of a Gaussian random variable % with mean MU and standard deviation SIGMA, below the threshold Z % if MINIMIZE is true, above the threshold Z otherwise. % % NOTE % % Starting with STK 2.4.1, it is recommended to use stk_sampcrit_ei_eval % instead of this function. Be careful, however, with the "direction" of % the improvement that you want to compute: % % EI = stk_sampcrit_ei_eval (MU, SIGMA, Z) % % computes the expected improvement *below* the threshold Z, and is thus % equivalent to % % EI = stk_distrib_normal_ei (Z, MU, SIGMA, true) % % To compute the expected improvement *above* Z, change signs as follows: % % EI = stk_sampcrit_ei_eval (-MU, SIGMA, -Z) % % REFERENCES % % [1] D. R. Jones, M. Schonlau and William J. Welch. Efficient global % optimization of expensive black-box functions. Journal of Global % Optimization, 13(4):455-492, 1998. % % [2] J. Mockus, V. Tiesis and A. Zilinskas. The application of Bayesian % methods for seeking the extremum. In L.C.W. Dixon and G.P. Szego, % editors, Towards Global Optimization, volume 2, pages 117-129, North % Holland, New York, 1978. % % See also stk_sampcrit_ei_eval, stk_distrib_student_ei % Copyright Notice % % Copyright (C) 2015, 2017 CentraleSupelec % Copyright (C) 2013, 2014 SUPELEC % % Authors: Julien Bect % Romain Benassi % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function ei = stk_distrib_normal_ei (z, mu, sigma, minimize) if nargin > 4, stk_error ('Too many input arguments.', 'TooManyInputArgs'); end if nargin > 1, delta = bsxfun (@minus, mu, z); else % Default: mu = 0; delta = - z; end if nargin > 2, sigma(sigma < 0) = nan; else % Default: sigma = 1 sigma = 1; end % Default: compute the EI for a maximization problem if nargin > 3, minimize = logical (minimize); else minimize = false; end % Reduce to the maximization case if minimize, delta = - delta; end [delta, sigma] = stk_commonsize (delta, sigma); ei = nan (size (delta)); b0 = ~ (isnan (delta) | isnan (sigma)); b1 = (sigma > 0); % Compute the EI where sigma > 0 b = b0 & b1; if any (b) u = delta(b) ./ sigma(b); ei(b) = sigma(b) .* (stk_distrib_normal_pdf (u) ... + u .* stk_distrib_normal_cdf (u)); end % Compute the EI where sigma == 0 b = b0 & (~ b1); ei(b) = max (0, delta(b)); % Correct numerical inaccuracies ei(ei < 0) = 0; end % function %!assert (stk_isequal_tolrel (stk_distrib_normal_ei (0.0), 1 / sqrt (2 * pi), eps)) %!test % Decreasing as a function of z %! ei = stk_distrib_normal_ei (linspace (-10, 10, 200)); %! assert (all (diff (ei) < 0)) %!shared M, mu, sigma, ei %! M = randn (1, 10); %! mu = randn (5, 1); %! sigma = 1 + rand (1, 1, 7); %! ei = stk_distrib_normal_ei (M, mu, sigma); %!assert (isequal (size (ei), [5, 10, 7])) %!assert (all (ei(:) >= 0)) %!assert (isequal (ei, stk_distrib_normal_ei (M, mu, sigma, false))); %!assert (isequal (ei, stk_distrib_normal_ei (-M, -mu, sigma, true))); stk/inst/misc/distrib/stk_distrib_normal_pdf.m0000644000000000000000000000445213156161544017030 0ustar % STK_DISTRIB_NORMAL_PDF [STK internal] % Copyright Notice % % Copyright (C) 2013, 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function density = stk_distrib_normal_pdf (z, mu, sigma) if nargin > 3, stk_error ('Too many input arguments.', 'TooManyInputArgs'); end if nargin > 1, z = bsxfun (@minus, z, mu); end if nargin > 2, [z, sigma] = stk_commonsize (z, sigma); z = z ./ sigma; k0 = (sigma > 0); else sigma = 1; k0 = 1; end xx = z .^ 2; density = nan (size (z)); k0 = k0 & (~ isnan (z)); kb = (xx > 1491); % when x^2 > 1491, the result is 0 in double precision % Deal with "large" values of abs(x) k = k0 & kb; density(k) = 0; % Deal with "small" values of abs(x) k = k0 & (~ kb); density(k) = 0.39894228040143268 * exp (- 0.5 * xx(k)); density = bsxfun (@rdivide, density, sigma); end % function %!assert (stk_isequal_tolrel (stk_distrib_normal_pdf ([1; 3], 1, [1 10]), ... %! [1 / sqrt(2 * pi) ... % normpdf ((1 - 1) / 1) %! 0.1 / sqrt(2 * pi); ... % normpdf ((1 - 1) / 10) / 10 %! exp(-2) / sqrt(2 * pi) ... % normpdf ((3 - 1) / 1) %! 3.910426939754558780e-2 ... % normpdf ((3 - 1) / 10) / 10 %! ], eps)); %!assert (isequal (stk_distrib_normal_pdf (inf), 0.0)); %!assert (isequal (stk_distrib_normal_pdf (-inf), 0.0)); %!assert (isnan (stk_distrib_normal_pdf (nan))); %!assert (isnan (stk_distrib_normal_pdf (0, 0, -1))); stk/inst/misc/distrib/stk_distrib_student_cdf.m0000644000000000000000000000635613156161544017216 0ustar % STK_DISTRIB_STUDENT_CDF [STK internal] % Copyright Notice % % Copyright (C) 2013, 2014 SUPELEC % % Author: Julien Bect % % This code is very loosely based on Octave's tcdf function: % ## Copyright (C) 2013 Julien Bect % ## Copyright (C) 2012 Rik Wehbring % ## Copyright (C) 1995-2012 Kurt Hornik % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function [p, q] = stk_distrib_student_cdf (z, nu, mu, sigma) if nargin > 4, stk_error ('Too many input arguments.', 'TooManyInputArgs'); end if nargin > 2, z = bsxfun (@minus, z, mu); end if nargin > 3, z = bsxfun (@rdivide, z, sigma); end xx = z .^ 2; [z, xx, nu] = stk_commonsize (z, xx, nu); % Return NaN for negative values of nu (or nu == NaN, or x == NaN) p = nan (size (z)); q = nan (size (z)); k0 = (nu > 0) & (~ isnan (z)); % Gaussian case (nu = +inf) k_inf = isinf (nu); k = k0 & k_inf; [p(k), q(k)] = stk_distrib_normal_cdf (z(k)); k0 = k0 & (~ k_inf); kp = (z > 0); kn = k0 & (~ kp); kp = k0 & kp; k_big_abs = (xx > nu); % Student case (nu < +inf) for positive x: compute q first, then p = 1 - q k = kp & k_big_abs; q(k) = betainc (nu(k) ./ (nu(k) + xx(k)), nu(k)/2, 1/2) / 2; k = kp & (~ k_big_abs); q(k) = 0.5 * (1 - betainc (xx(k) ./ (nu(k) + xx(k)), 1/2, nu(k)/2)); p(kp) = 1 - q(kp); % Student case (nu < +inf) for negative x: compute p first, then q = 1 - p k = kn & k_big_abs; p(k) = betainc (nu(k) ./ (nu(k) + xx(k)), nu(k)/2, 1/2) / 2; k = kn & (~ k_big_abs); p(k) = 0.5 * (1 - betainc (xx(k) ./ (nu(k) + xx(k)), 1/2, nu(k)/2)); q(kn) = 1 - p(kn); end % function %!assert (stk_isequal_tolrel ( ... %! stk_distrib_student_cdf ([-1; 0; 1], [1 2], 0, [1 10]), ... %! [0.25, ... % tcdf ((-1 - 0)/1, 1) %! 4.6473271920707004e-01; ... % tcdf ((-1 - 0)/10, 2) %! 0.50, ... % tcdf (( 0 - 0)/1, 1) %! 0.50; ... % tcdf (( 0 - 0)/10, 2) %! 0.75, ... % tcdf (( 1 - 0)/1, 1) %! 5.3526728079292996e-01 ... % tcdf (( 1 - 0)/10, 2) %! ], 4 * eps)) %!test %! [p, q] = stk_distrib_student_cdf (1e10, 2); %! assert (isequal (p, 1.0)); %! assert (stk_isequal_tolrel (q, 4.999999999999999999925e-21, 10 * eps)); %!assert (isequal (stk_distrib_student_cdf (0.0, 1), 0.5)); %!assert (isequal (stk_distrib_student_cdf (inf, 1), 1.0)); %!assert (isequal (stk_distrib_student_cdf (-inf, 1), 0.0)); %!assert (isnan (stk_distrib_student_cdf (nan, 1))); stk/inst/misc/distrib/stk_distrib_student_ei.m0000644000000000000000000001006213156161544017044 0ustar % STK_DISTRIB_STUDENT_EI computes the Student expected improvement % % CALL: EI = stk_distrib_student_ei (Z, NU) % % computes the expected improvement of a Student random variable with NU % degrees of freedom above the threshold Z. % % CALL: EI = stk_distrib_student_ei (Z, NU, MU, SIGMA) % % computes the expected improvement of a Student random variable with NU % degrees of freedom, location parameter MU and scale parameter SIGMA, % above the threshold Z. % % CALL: EI = stk_distrib_student_ei (Z, NU, MU, SIGMA, MINIMIZE) % % computes the expected improvement of a Student random variable with NU % degrees of freedom, location parameter MU and scale parameter SIGMA, % below the threshold Z if MINIMIZE is true, above the threshold Z % otherwise. % % REFERENCES % % [1] R. Benassi, J. Bect and E. Vazquez. Robust Gaussian process-based % global optimization using a fully Bayesian expected improvement % criterion. In: Learning and Intelligent Optimization (LION 5), % LNCS 6683, pp. 176-190, Springer, 2011 % % [2] B. Williams, T. Santner and W. Notz. Sequential Design of Computer % Experiments to Minimize Integrated Response Functions. Statistica % Sinica, 10(4):1133-1152, 2000. % % See also stk_distrib_normal_ei % Copyright Notice % % Copyright (C) 2013, 2014 SUPELEC % % Authors: Julien Bect % Romain Benassi % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function ei = stk_distrib_student_ei (z, nu, mu, sigma, minimize) if nargin > 5, stk_error ('Too many input arguments.', 'TooManyInputArgs'); end nu(nu < 0) = nan; if nargin > 2, delta = bsxfun (@minus, mu, z); else % Default: mu = 0; delta = - z; end if nargin > 3, sigma(sigma < 0) = nan; else % Default sigma = 1; end % Default: compute the EI for a maximization problem if nargin > 4, minimize = logical (minimize); else minimize = false; end % Reduce to the maximization case if minimize, delta = - delta; end [delta, nu, sigma] = stk_commonsize (delta, nu, sigma); ei = nan (size (delta)); b0 = ~ (isnan (delta) | isnan (nu) | isnan (sigma)); b1 = (nu > 1); b2 = (sigma > 0); % The EI is infinite for nu <= 1 ei(b0 & (~ b1)) = +inf; b0 = b0 & b1; % Compute the EI where nu > 1 and sigma > 0 b = b0 & b2; if any (b) u = delta(b) ./ sigma(b); nu = nu(b); ei(b) = sigma(b) .* ((nu + u .^ 2) ./ (nu - 1) ... .* stk_distrib_student_pdf (u, nu) ... + u .* stk_distrib_student_cdf (u, nu)); end % Compute the EI where nu > 1 and sigma == 0 b = b0 & (~ b2); ei(b) = max (0, delta(b)); % Correct numerical inaccuracies ei(ei < 0) = 0; end % function %!assert (stk_isequal_tolrel (stk_distrib_student_ei (0, 2), 1 / sqrt (2), eps)) %!test % Decreasing as a function of z %! ei = stk_distrib_student_ei (linspace (-10, 10, 200), 3.33); %! assert (all (diff (ei) < 0)) %!shared M, mu, sigma, ei, nu %! M = randn (1, 10); %! mu = randn (5, 1); %! sigma = 1 + rand (1, 1, 7); %! nu = 2; %! ei = stk_distrib_student_ei (M, nu, mu, sigma); %!assert (isequal (size (ei), [5, 10, 7])) %!assert (all (ei(:) >= 0)) %!assert (isequal (ei, stk_distrib_student_ei (M, nu, mu, sigma, false))); %!assert (isequal (ei, stk_distrib_student_ei (-M, nu, -mu, sigma, true))); stk/inst/misc/distrib/stk_distrib_student_pdf.m0000644000000000000000000000532313156161544017224 0ustar % STK_DISTRIB_STUDENT_PDF [STK internal] % Copyright Notice % % Copyright (C) 2013, 2014 SUPELEC % % Author: Julien Bect % % This code is very loosely based on Octave's tpdf function: % ## Copyright (C) 2012 Rik Wehbring % ## Copyright (C) 1995-2012 Kurt Hornik % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function density = stk_distrib_student_pdf (z, nu, mu, sigma) if nargin > 4, stk_error ('Too many input arguments.', 'TooManyInputArgs'); end if nargin > 2, z = bsxfun (@minus, z, mu); end if nargin > 3, z = bsxfun (@rdivide, z, sigma); else sigma = 1; end C = sqrt (nu) .* beta (nu / 2, 0.5); if isscalar (nu) if nu == +inf % Gaussian case (nu = +inf) density = 0.39894228040143268 * exp (- 0.5 * (z .^ 2)); else % Student case (nu < +inf) density = exp (- 0.5 * (nu + 1) * log (1 + z .^ 2 / nu)) / C; end else [z, nu, C] = stk_commonsize (z, nu, C); density = nan (size (z)); % Gaussian case (nu = +inf) k = (nu == +inf); density(k) = 0.39894228040143268 * exp (- 0.5 * (z(k) .^ 2)); % Student case (nu < +inf) k = (nu > 0); nu = nu(k); density(k) = exp (- 0.5 * (nu + 1) .* log (1 + z(k) .^ 2 ./ nu)) ./ C(k); end density = bsxfun (@rdivide, density, sigma); end % function %!assert (stk_isequal_tolrel ( ... %! stk_distrib_student_pdf ([1; 3], [1; 2], [0 1], [1 10]), ... %! [0.50 / pi ... % tpdf ((1 - 1) / 10, 1) %! 0.10 / pi; ... % tpdf ((1 - 1) / 10, 1) / 10 %! 1 / (11 * sqrt(11)) ... % tpdf ((3 - 0) / 1, 2) / 1 %! 3.4320590294804165e-02 ... % tpdf ((3 - 1) / 10, 2) / 10 %! ], eps)); %!assert (isequal (stk_distrib_student_pdf ( inf, 1.0), 0.0)); %!assert (isequal (stk_distrib_student_pdf (-inf, 1.0), 0.0)); %!assert (isnan (stk_distrib_student_pdf ( nan, 1.0))); stk/inst/misc/error/0000755000000000000000000000000013156161544011614 5ustar stk/inst/misc/error/stk_assert_box.m0000644000000000000000000000427113156161544015030 0ustar % STK_ASSERT_BOX ... [FIXME: missing documentation] % Copyright Notice % % Copyright (C) 2017 CentraleSupelec % Copyright (C) 2012 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function stk_assert_box (box, dim) mnemonic = 'InvalidBox'; % Name of the input variable (if available) boxname = inputname (1); if isempty (boxname), boxname = 'box'; end % Pretend that the error has been thrown by the caller stack = dbstack; stack = stack(2:end); if (~ isnumeric (box)) || (ndims (box) ~= 2) %#ok see CODING_GUDELINES errmsg = sprintf ('%s is not a numeric matrix.', boxname); stk_error (errmsg, mnemonic, stack); end [n, d] = size (box); if n ~= 2, errmsg = sprintf ('%s should have two rows, not more, not less.', boxname); stk_error (errmsg, mnemonic, stack); end if d == 0, errmsg = sprintf ('%s should have at least one column.', boxname); stk_error (errmsg, mnemonic, stack); end if (nargin == 2) && (d ~= dim) errmsg = sprintf ('%s should have exactly %d columns.', boxname, dim); stk_error (errmsg, mnemonic, stack); end if any (isnan (box)), errmsg = sprintf ('%s should at least one column.', boxname); stk_error (errmsg, mnemonic, stack); end if any (box(1, :) > box(2, :)), errmsg = sprintf ('%s has invalid boundaries.', boxname); stk_error (errmsg, mnemonic, stack); end end % function stk/inst/misc/error/stk_error.m0000644000000000000000000000612313156161544014006 0ustar % STK_ERROR throws an STK error with a good-looking error identifier. % Copyright Notice % % Copyright (C) 2017 CentraleSupelec % Copyright (C) 2012 SUPELEC % % Authors: Julien Bect % Emmanuel Vazquez % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function stk_error (errmsg, mnemonic, stack) % Second component of error identifier = name of calling function % (unless stk_error has been called directly from the base workspace) if nargin < 3, try stack = dbstack ('-completenames'); % In Octave, -completenames is at best ignored (in recent versions) % or generates an error (in, e.g., Octave 3.6.2). catch stack = dbstack (); end if length (stack) == 1, caller = 'BaseWorkspace'; else % pretend that the error has been thrown by the caller stack = stack(2:end); % and get caller name to form the error identifier caller = stack(1).name; end else % If a "stack" has been provided by the user, we use it without asking % questions (if it's a struct) if ~ isstruct (stack) || ~ isfield (stack, 'name'), % We will throw an error, but not the one we were requested to! errmsg = 'Argument "stack" should be a valid stack structure.'; mnemonic = 'InvalidArgument'; stack = dbstack (); end caller = stack(1).name; end % Keep only subfunction name (Octave) gt_pos = strfind (caller, '>'); if ~ isempty (gt_pos), caller = caller((gt_pos + 1):end); end % Construct the error structure errstruct = struct (... 'message', errmsg, ... 'identifier', sprintf ('STK:%s:%s', caller, mnemonic), ... 'stack', stack); % Note: the 'stack' argument is ignore in Octave 4.0.0 and earlier % releases (see https://savannah.gnu.org/bugs/?47107) error (errstruct); end % function %!shared errmsg, mnemonic, badstack %! errmsg = 'Go ahead, make my day.'; %! mnemonic = 'ClintEastwood'; %! badstack = 0; % not a valid stack structure % Valid use of stk_error %!error stk_error(errmsg, mnemonic); % Use of an incorrect stack structure %!error stk_error (errmsg, mnemonic, badstack); %!error id=STK:stk_error:InvalidArgument stk_error (errmsg, mnemonic, badstack); stk/inst/misc/mole/0000755000000000000000000000000013156161544011417 5ustar stk/inst/misc/mole/graphics_toolkit/0000755000000000000000000000000013156161544014764 5ustar stk/inst/misc/mole/graphics_toolkit/graphics_toolkit.m0000644000000000000000000000414613156161544020514 0ustar % GRAPHICS_TOOLKIT indicates which toolkit is assigned to new figures. % % This is a (partial) replacement for the graphics_toolkit function that is missing both % from Matlab and from some old version f Octave. % % CALL: NAME = graphics_toolkit () % % returns: % % * the result of get (0, 'defaultfigure__backend__') if you're running an old version % of Octave that does not have graphics_toolkit, % % * 'matlab-nojvm' if running Matlab without the Java Virtual Machine, % % * 'matlab-jvm' if running Matlab with the Java Virtual Machine. % Copyright Notice % % Copyright (C) 2013, 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function name = graphics_toolkit () if exist ('OCTAVE_VERSION', 'builtin') == 5 % Octave try % This should work on older versions of Octave, e.g., 3.2.4 % (there was no notion of a 'toolkit' at the time, but if gnuplot % is reported as the backend, then it is also the toolkit) name = get (0, 'defaultfigure__backend__'); catch error ('Unable to determine which toolkit is being used.'); end else % Matlab try assert (usejava ('jvm')); name = 'matlab-jvm'; catch name = 'matlab-nojvm'; end end end % function %#ok<*CTCH> stk/inst/misc/mole/isrow/0000755000000000000000000000000013156161544012562 5ustar stk/inst/misc/mole/isrow/isrow.m0000644000000000000000000000211013156161544014075 0ustar % ISROW returns true for row vectors and false otherwise % Copyright Notice % % Copyright (C) 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function b = isrow (x) n = length (x); b = isequal (size (x), [1 n]); end % function stk/inst/misc/mole/linsolve/0000755000000000000000000000000013156161544013252 5ustar stk/inst/misc/mole/linsolve/linsolve.m0000644000000000000000000001050713156161544015266 0ustar ## Copyright (C) 2013 Nir Krakauer ## ## 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 . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{x} =} linsolve (@var{A}, @var{b}) ## @deftypefnx {Function File} {@var{x} =} linsolve (@var{A}, @var{b}, @var{opts}) ## @deftypefnx {Function File} {[@var{x}, @var{R}] =} linsolve (@dots{}) ## Solve the linear system @code{A*x = b}. ## ## With no options, this function is equivalent to the left division operator ## @w{(@code{x = A \ b})} or the matrix-left-divide function ## @w{(@code{x = mldivide (A, b)})}. ## ## Octave ordinarily examines the properties of the matrix @var{A} and chooses ## a solver that best matches the matrix. By passing a structure @var{opts} ## to @code{linsolve} you can inform Octave directly about the matrix @var{A}. ## In this case Octave will skip the matrix examination and proceed directly ## to solving the linear system. ## ## @strong{Warning:} If the matrix @var{A} does not have the properties ## listed in the @var{opts} structure then the result will not be accurate ## AND no warning will be given. When in doubt, let Octave examine the matrix ## and choose the appropriate solver as this step takes little time and the ## result is cached so that it is only done once per linear system. ## ## Possible @var{opts} fields (set value to true/false): ## ## @table @asis ## @item LT ## @var{A} is lower triangular ## ## @item UT ## @var{A} is upper triangular ## ## @item UHESS ## @var{A} is upper Hessenberg (currently makes no difference) ## ## @item SYM ## @var{A} is symmetric or complex Hermitian (currently makes no difference) ## ## @item POSDEF ## @var{A} is positive definite ## ## @item RECT ## @var{A} is general rectangular (currently makes no difference) ## ## @item TRANSA ## Solve @code{A'*x = b} by @code{transpose (A) \ b} ## @end table ## ## The optional second output @var{R} is the inverse condition number of ## @var{A} (zero if matrix is singular). ## @seealso{mldivide, matrix_type, rcond} ## @end deftypefn ## Author: Nir Krakauer ## STK notes: ## * This version of linsolve.m comes from revision b66f068e4468 of Octave's ## hg repository (changeset by Nir Krakauer on 2013-09-26, 09:38:51) ## * The only change that has been made is the introduction of a tolerance ## in the first assert of the first unit test, that's all ! function [x, R] = linsolve (A, b, opts) if (nargin < 2 || nargin > 3) print_usage (); endif if (! (isnumeric (A) && isnumeric (b))) error ("linsolve: A and B must be numeric"); endif ## Process any opts if (nargin > 2) if (! isstruct (opts)) error ("linsolve: OPTS must be a structure"); endif trans_A = false; if (isfield (opts, "TRANSA") && opts.TRANSA) trans_A = true; A = A'; endif if (isfield (opts, "POSDEF") && opts.POSDEF) A = matrix_type (A, "positive definite"); endif if (isfield (opts, "LT") && opts.LT) if (trans_A) A = matrix_type (A, "upper"); else A = matrix_type (A, "lower"); endif endif if (isfield (opts, "UT") && opts.UT) if (trans_A) A = matrix_type (A, "lower"); else A = matrix_type (A, "upper"); endif endif endif x = A \ b; if (nargout > 1) if (issquare (A)) R = rcond (A); else R = 0; endif endif endfunction # linsolve %!test %! n = 4; %! A = triu (rand (n)); %! x = rand (n, 1); %! b = A' * x; %! opts.UT = true; %! opts.TRANSA = true; %! assert (linsolve (A, b, opts), A' \ b, 1e-12); %!error linsolve () %!error linsolve (1) %!error linsolve (1,2,3) %!error linsolve ({1},2) %!error linsolve (1,{2}) %!error linsolve (1,2,3) stk/inst/misc/mole/quantile/0000755000000000000000000000000013156161544013241 5ustar stk/inst/misc/mole/quantile/quantile.m0000644000000000000000000003701013156161544015242 0ustar % QUANTILE ... % Copyright Notice % % Copyright (C) 2013 SUPELEC % % Author: Julien Bect % % The function comes from Octave 3.7.6+'s quantile.m, with minor % modifications. The original copyright notice was: % % Copyright (C) 2008-2012 Ben Abbott and Jaroslav Hajek % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . % ## Copyright (C) 2008-2012 Ben Abbott and Jaroslav Hajek % ## % ## This file is part of Octave. % ## % ## Octave 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. % ## % ## Octave 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 Octave; see the file COPYING. If not, see % ## . % % ## -*- texinfo -*- % ## @deftypefn {Function File} {@var{q} =} quantile (@var{x}) % ## @deftypefnx {Function File} {@var{q} =} quantile (@var{x}, @var{p}) % ## @deftypefnx {Function File} {@var{q} =} quantile (@var{x}, @var{p}, @var{dim}) % ## @deftypefnx {Function File} {@var{q} =} quantile (@var{x}, @var{p}, @var{dim}, @var{method}) % ## For a sample, @var{x}, calculate the quantiles, @var{q}, corresponding to % ## the cumulative probability values in @var{p}. All non-numeric values (NaNs) % ## of @var{x} are ignored. % ## % ## If @var{x} is a matrix, compute the quantiles for each column and % ## return them in a matrix, such that the i-th row of @var{q} contains % ## the @var{p}(i)th quantiles of each column of @var{x}. % ## % ## If @var{p} is unspecified, return the quantiles for % ## @code{[0.00 0.25 0.50 0.75 1.00]}. % ## The optional argument @var{dim} determines the dimension along which % ## the quantiles are calculated. If @var{dim} is omitted, and @var{x} is % ## a vector or matrix, it defaults to 1 (column-wise quantiles). If % ## @var{x} is an N-D array, @var{dim} defaults to the first non-singleton % ## dimension. % ## % ## The methods available to calculate sample quantiles are the nine methods % ## used by R (@url{http://www.r-project.org/}). The default value is % ## @w{METHOD = 5}. % ## % ## Discontinuous sample quantile methods 1, 2, and 3 % ## % ## @enumerate 1 % ## @item Method 1: Inverse of empirical distribution function. % ## % ## @item Method 2: Similar to method 1 but with averaging at discontinuities. % ## % ## @item Method 3: SAS definition: nearest even order statistic. % ## @end enumerate % ## % ## Continuous sample quantile methods 4 through 9, where p(k) is the linear % ## interpolation function respecting each methods' representative cdf. % ## % ## @enumerate 4 % ## @item Method 4: p(k) = k / n. That is, linear interpolation of the % ## empirical cdf. % ## % ## @item Method 5: p(k) = (k - 0.5) / n. That is a piecewise linear function % ## where the knots are the values midway through the steps of the empirical % ## cdf. % ## % ## @item Method 6: p(k) = k / (n + 1). % ## % ## @item Method 7: p(k) = (k - 1) / (n - 1). % ## % ## @item Method 8: p(k) = (k - 1/3) / (n + 1/3). The resulting quantile % ## estimates are approximately median-unbiased regardless of the distribution % ## of @var{x}. % ## % ## @item Method 9: p(k) = (k - 3/8) / (n + 1/4). The resulting quantile % ## estimates are approximately unbiased for the expected order statistics if % ## @var{x} is normally distributed. % ## @end enumerate % ## % ## Hyndman and Fan (1996) recommend method 8. Maxima, S, and R % ## (versions prior to 2.0.0) use 7 as their default. Minitab and SPSS % ## use method 6. @sc{matlab} uses method 5. % ## % ## References: % ## % ## @itemize @bullet % ## @item Becker, R. A., Chambers, J. M. and Wilks, A. R. (1988) The New % ## S Language. Wadsworth & Brooks/Cole. % ## % ## @item Hyndman, R. J. and Fan, Y. (1996) Sample quantiles in % ## statistical packages, American Statistician, 50, 361--365. % ## % ## @item R: A Language and Environment for Statistical Computing; % ## @url{http://cran.r-project.org/doc/manuals/fullrefman.pdf}. % ## @end itemize % ## % ## Examples: % ## @c Set example in small font to prevent overfull line % ## % ## @smallexample % ## @group % ## x = randi (1000, [10, 1]); # Create empirical data in range 1-1000 % ## q = quantile (x, [0, 1]); # Return minimum, maximum of distribution % ## q = quantile (x, [0.25 0.5 0.75]); # Return quartiles of distribution % ## @end group % ## @end smallexample % ## @seealso{prctile} % ## @end deftypefn % % ## Author: Ben Abbott % ## Description: Matlab style quantile function of a discrete/continuous distribution function q = quantile (x, p, dim, method) if nargin < 2, p = []; end if nargin < 3, dim = 1; end if nargin < 4, % Use Matlab compatiblity mode method = 5; end if (~ (isnumeric (x) || islogical (x))) error ('quantile: X must be a numeric vector or matrix'); end if (isempty (p)) p = [0.00 0.25, 0.50, 0.75, 1.00]; end if (~ (isnumeric (p) && isvector (p))) error ('quantile: P must be a numeric vector'); end if (~ (isscalar (dim) && dim == fix (dim)) ... || ~(1 <= dim && dim <= ndims (x))) error ('quantile: DIM must be an integer and a valid dimension'); end % Set the permutation vector. perm = 1:ndims (x); perm(1) = dim; perm(dim) = 1; % Permute dim to the 1st index. x = permute (x, perm); % Save the size of the permuted x N-d array. sx = size (x); % Reshape to a 2-d array. x = reshape (x, [sx(1), prod(sx(2:end))]); % Calculate the quantiles. q = octave__quantile__ (x, p, method); % Return the shape to the original N-d array. q = reshape (q, [numel(p), sx(2:end)]); % Permute the 1st index back to dim. q = ipermute (q, perm); end % function %!test %! p = 0.5; %! x = sort (rand (11)); %! q = quantile (x, p); %! assert (isequal (q, x(6,:))); %! x = x.'; %! q = quantile (x, p, 2); %! assert (isequal (q, x(:,6))); % Note: method 3 not available yet because Matlab doesn't have roundb() %!test %! p = [0.00, 0.25, 0.50, 0.75, 1.00]; %! x = [1; 2; 3; 4]; %! a = [1.0000 1.0000 2.0000 3.0000 4.0000 %! 1.0000 1.5000 2.5000 3.5000 4.0000 %! 1.0000 1.0000 2.0000 3.0000 4.0000 %! 1.0000 1.0000 2.0000 3.0000 4.0000 %! 1.0000 1.5000 2.5000 3.5000 4.0000 %! 1.0000 1.2500 2.5000 3.7500 4.0000 %! 1.0000 1.7500 2.5000 3.2500 4.0000 %! 1.0000 1.4167 2.5000 3.5833 4.0000 %! 1.0000 1.4375 2.5000 3.5625 4.0000]; %! for m = [1:2 4:9] %! q = quantile (x, p, 1, m).'; %! assert (stk_isequal_tolabs (q, a(m,:), 0.0001)); %! end %!test %! p = [0.00, 0.25, 0.50, 0.75, 1.00]; %! x = [1; 2; 3; 4; 5]; %! a = [1.0000 2.0000 3.0000 4.0000 5.0000 %! 1.0000 2.0000 3.0000 4.0000 5.0000 %! 1.0000 1.0000 2.0000 4.0000 5.0000 %! 1.0000 1.2500 2.5000 3.7500 5.0000 %! 1.0000 1.7500 3.0000 4.2500 5.0000 %! 1.0000 1.5000 3.0000 4.5000 5.0000 %! 1.0000 2.0000 3.0000 4.0000 5.0000 %! 1.0000 1.6667 3.0000 4.3333 5.0000 %! 1.0000 1.6875 3.0000 4.3125 5.0000]; %! for m = [1:2 4:9] %! q = quantile (x, p, 1, m).'; %! assert (stk_isequal_tolabs (q, a(m,:), 0.0001)); %! end %!test %! p = [0.00, 0.25, 0.50, 0.75, 1.00]; %! x = [1; 2; 5; 9]; %! a = [1.0000 1.0000 2.0000 5.0000 9.0000 %! 1.0000 1.5000 3.5000 7.0000 9.0000 %! 1.0000 1.0000 2.0000 5.0000 9.0000 %! 1.0000 1.0000 2.0000 5.0000 9.0000 %! 1.0000 1.5000 3.5000 7.0000 9.0000 %! 1.0000 1.2500 3.5000 8.0000 9.0000 %! 1.0000 1.7500 3.5000 6.0000 9.0000 %! 1.0000 1.4167 3.5000 7.3333 9.0000 %! 1.0000 1.4375 3.5000 7.2500 9.0000]; %! for m = [1:2 4:9] %! q = quantile (x, p, 1, m).'; %! assert (stk_isequal_tolabs (q, a(m,:), 0.0001)); %! end %!test %! p = [0.00, 0.25, 0.50, 0.75, 1.00]; %! x = [1; 2; 5; 9; 11]; %! a = [1.0000 2.0000 5.0000 9.0000 11.0000 %! 1.0000 2.0000 5.0000 9.0000 11.0000 %! 1.0000 1.0000 2.0000 9.0000 11.0000 %! 1.0000 1.2500 3.5000 8.0000 11.0000 %! 1.0000 1.7500 5.0000 9.5000 11.0000 %! 1.0000 1.5000 5.0000 10.0000 11.0000 %! 1.0000 2.0000 5.0000 9.0000 11.0000 %! 1.0000 1.6667 5.0000 9.6667 11.0000 %! 1.0000 1.6875 5.0000 9.6250 11.0000]; %! for m = [1:2 4:9] %! q = quantile (x, p, 1, m).'; %! assert (stk_isequal_tolabs (q, a(m,:), 0.0001)); %! end %!test %! p = [0.00, 0.25, 0.50, 0.75, 1.00]; %! x = [16; 11; 15; 12; 15; 8; 11; 12; 6; 10]; %! a = [6.0000 10.0000 11.0000 15.0000 16.0000 %! 6.0000 10.0000 11.5000 15.0000 16.0000 %! 6.0000 8.0000 11.0000 15.0000 16.0000 %! 6.0000 9.0000 11.0000 13.5000 16.0000 %! 6.0000 10.0000 11.5000 15.0000 16.0000 %! 6.0000 9.5000 11.5000 15.0000 16.0000 %! 6.0000 10.2500 11.5000 14.2500 16.0000 %! 6.0000 9.8333 11.5000 15.0000 16.0000 %! 6.0000 9.8750 11.5000 15.0000 16.0000]; %! for m = [1:2 4:9] %! q = quantile (x, p, 1, m).'; %! assert (stk_isequal_tolabs (q, a(m,:), 0.0001)); %! end %!test %! p = [0.00, 0.25, 0.50, 0.75, 1.00]; %! x = [-0.58851; 0.40048; 0.49527; -2.551500; -0.52057; ... %! -0.17841; 0.057322; -0.62523; 0.042906; 0.12337]; %! a = [-2.551474 -0.588505 -0.178409 0.123366 0.495271 %! -2.551474 -0.588505 -0.067751 0.123366 0.495271 %! -2.551474 -0.625231 -0.178409 0.123366 0.495271 %! -2.551474 -0.606868 -0.178409 0.090344 0.495271 %! -2.551474 -0.588505 -0.067751 0.123366 0.495271 %! -2.551474 -0.597687 -0.067751 0.192645 0.495271 %! -2.551474 -0.571522 -0.067751 0.106855 0.495271 %! -2.551474 -0.591566 -0.067751 0.146459 0.495271 %! -2.551474 -0.590801 -0.067751 0.140686 0.495271]; %! for m = [1:2 4:9] %! q = quantile (x, p, 1, m).'; %! assert (stk_isequal_tolabs (q, a(m,:), 0.0001)); %! end %!test %! p = 0.5; %! x = [0.112600, 0.114800, 0.052100, 0.236400, 0.139300 %! 0.171800, 0.727300, 0.204100, 0.453100, 0.158500 %! 0.279500, 0.797800, 0.329600, 0.556700, 0.730700 %! 0.428800, 0.875300, 0.647700, 0.628700, 0.816500 %! 0.933100, 0.931200, 0.963500, 0.779600, 0.846100]; %! tol = 0.00001; %! x(5,5) = NaN; %! assert (stk_isequal_tolabs ... %! (quantile (x, p, 1), ... %! [0.27950, 0.79780, 0.32960, 0.55670, 0.44460], tol)); %! x(1,1) = NaN; %! assert (stk_isequal_tolabs ... %! (quantile (x, p, 1), ... %! [0.35415, 0.79780, 0.32960, 0.55670, 0.44460], tol)); %! x(3,3) = NaN; %! assert (stk_isequal_tolabs ... %! (quantile (x, p, 1), ... %! [0.35415, 0.79780, 0.42590, 0.55670, 0.44460], tol)); %!test %! sx = [2, 3, 4]; %! x = rand (sx); %! dim = 2; %! p = 0.5; %! yobs = quantile (x, p, dim); %! yexp = median (x, dim); %! assert (isequal (yobs, yexp)); %% Test input validation %!error quantile () %!error quantile (1, 2, 3, 4, 5) %!error quantile (['A'; 'B'], 10) %!error quantile (1:10, [true, false]) %!error quantile (1:10, ones (2,2)) %!error quantile (1, 1, 1.5) %!error quantile (1, 1, 0) %!error quantile (1, 1, 3) %!error quantile ((1:5)', 0.5, 1, 0) %!error quantile ((1:5)', 0.5, 1, 10) % ## For the cumulative probability values in @var{p}, compute the % ## quantiles, @var{q} (the inverse of the cdf), for the sample, @var{x}. % ## % ## The optional input, @var{method}, refers to nine methods available in R % ## (http://www.r-project.org/). The default is @var{method} = 7. % ## @seealso{prctile, quantile, statistics} % % ## Author: Ben Abbott % ## Vectorized version: Jaroslav Hajek % ## Description: Quantile function of empirical samples function inv = octave__quantile__ (x, p, method) if (isinteger (x) || islogical (x)) x = double (x); end % set shape of quantiles to column vector. p = p(:); % Save length and set shape of samples. % FIXME: does sort guarantee that NaN's come at the end? x = sort (x); m = sum (~ isnan (x)); [xr, xc] = size (x); % Initialize output values. inv = Inf (class (x)) * (-(p < 0) + (p > 1)); inv = repmat (inv, 1, xc); % Do the work. k = find ((p >= 0) & (p <= 1)); if (any (k)) n = length (k); p = p(k); % Special case of 1 row. if (xr == 1) inv(k,:) = repmat (x, n, 1); return; end % The column-distribution indices. pcd = kron (ones (n, 1), xr*(0:xc-1)); mm = kron (ones (n, 1), m); switch (method) case {1, 2, 3} switch (method) case 1 p = max (ceil (kron (p, m)), 1); inv(k,:) = x(p + pcd); case 2 p = kron (p, m); p_lr = max (ceil (p), 1); p_rl = min (floor (p + 1), mm); inv(k,:) = (x(p_lr + pcd) + x(p_rl + pcd))/2; case 3 % Used by SAS, method PCTLDEF=2. % http://support.sas.com/onlinedoc/913/getDoc/en/statug.hlp/stdize_sect14.htm t = max (kron (p, m), 1); t = roundb (t); inv(k,:) = x(t + pcd); end otherwise switch (method) case 4 p = kron (p, m); case 5 % Used by Matlab. p = kron (p, m) + 0.5; case 6 % Used by Minitab and SPSS. p = kron (p, m+1); case 7 % Used by S and R. p = kron (p, m-1) + 1; case 8 % Median unbiased. p = kron (p, m+1/3) + 1/3; case 9 % Approximately unbiased respecting order statistics. p = kron (p, m+0.25) + 0.375; otherwise error ('quantile: Unknown METHOD, ''%d''', method); end % Duplicate single values. imm1 = (mm == 1); x(2,imm1) = x(1,imm1); % Interval indices. pi = max (min (floor (p), mm-1), 1); pr = max (min (p - pi, 1), 0); pi = pi + pcd; inv(k,:) = (1-pr) .* x(pi) + pr .* x(pi+1); end end end % function stk/inst/misc/optim/0000755000000000000000000000000013156161544011613 5ustar stk/inst/misc/optim/@stk_optim_baseclass/0000755000000000000000000000000013156161544015744 5ustar stk/inst/misc/optim/@stk_optim_baseclass/isequal.m0000644000000000000000000000312013156161544017561 0ustar % ISEQUAL [overload base function] % Copyright Notice % % Copyright (C) 2017 CentraleSupelec % Copyright (C) 2013, 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . % INTERNAL NOTE: overloaded for Octave 3.2.x compat / see CODING_GUIDELINES function b = isequal (x, y, varargin) if nargin < 2 stk_error ('Not enough input arguments.', 'NotEnoughInputArgs'); end % First, make sure that x and y belong to the same class % (either stk_dataframe or some derived class) b = isa (x, 'stk_optim_baseclass') && strcmp (class (y), class (x)) ... && isequal (x.does_boxconstrained, y.does_boxconstrained) ... && isequal (x.does_unconstrained, y.does_unconstrained); if b && (nargin > 2) b = isequal (x, varargin{:}); end end % function stk/inst/misc/optim/@stk_optim_baseclass/stk_optim_baseclass.m0000644000000000000000000000347413156161544022163 0ustar % STK_OPTIM_BASECLASS [STK internal] % % CALL: ALGO = stk_optim_baseclass () % % constructs an abstract algorithm object ALGO of class 'stk_optim_baseclass'. % % STK INTERNAL WARNING: % % The class @stk_optim_baseclass is considered as internal. Its % implementation and interface are likely to change in future releases. % Ordinary users should refrain from using it directly. % Copyright Notice % % Copyright (C) 2017 Centrale % % Authors: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function algo = stk_optim_baseclass (does_boxconstrained, does_unconstrained) if nargin == 0 does_boxconstrained = false; does_unconstrained = false; elseif nargin > 2 stk_error ('Too many input arguments.', 'TooManyInputArgs'); end algo = struct ( ... 'does_boxconstrained', does_boxconstrained, ... 'does_unconstrained', does_unconstrained ); algo = class (algo, 'stk_optim_baseclass'); end % function %!test stk_test_class ('stk_optim_baseclass') stk/inst/misc/optim/@stk_optim_baseclass/stk_optim_isavailable.m0000644000000000000000000000252413156161544022472 0ustar % STK_OPTIM_ISAVAILABLE [overload STK function] % Copyright Notice % % Copyright (C) 2017 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function b = stk_optim_isavailable (algo) if algo.does_boxconstrained b1 = stk_optim_testmin_box (algo); end if algo.does_unconstrained b2 = stk_optim_testmin_unc (algo); end b = (algo.does_boxconstrained || algo.does_unconstrained) ... && ((~ algo.does_boxconstrained) || b1) ... && ((~ algo.does_unconstrained) || b2); end % function stk/inst/misc/optim/@stk_optim_fmincon/0000755000000000000000000000000013156161544015435 5ustar stk/inst/misc/optim/@stk_optim_fmincon/isequal.m0000644000000000000000000000276613156161544017271 0ustar % ISEQUAL [overload base function] % Copyright Notice % % Copyright (C) 2017 CentraleSupelec % Copyright (C) 2013, 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . % INTERNAL NOTE: overloaded for Octave 3.2.x compat / see CODING_GUIDELINES function b = isequal (x, y, varargin) if nargin < 2 stk_error ('Not enough input arguments.', 'NotEnoughInputArgs'); end % First, make sure that x and y belong to the same class % (either stk_dataframe or some derived class) b = isa (x, 'stk_optim_fmincon') && strcmp (class (y), class (x)) ... && isequal (x.options, y.options); if b && (nargin > 2) b = isequal (x, varargin{:}); end end % function stk/inst/misc/optim/@stk_optim_fmincon/stk_minimize_boxconstrained.m0000644000000000000000000000360713156161544023425 0ustar % STK_MINIMIZE_BOXCONSTRAINED performs boxconstrained minimisation using fmincon. % % CALL: U_OPT = stk_minimize_boxconstrained (ALGO, F, U_INIT, LB, UB) % % estimates the parameters U_OPT within the user-defined lowerbounds LB % and upper bounds UB, which gives the minimum value of the function F. A % starting point U_INIT must be provided. % % CALL: [U_OPT, LIK] = stk_minimize_boxconstrained (ALGO, F, U_INIT, LB, UB) % % also estimates the minimum function value LIK after the boxconstrained % minimisation using fmincon. % % NOTE: Here ALGO is an input argument to the function, that is an object of % class 'stk_optim_fmincon'. % Copyright Notice % % Copyright (C) 2014 SUPELEC & A. Ravisankar % % Authors: Julien Bect % Ashwin Ravisankar % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function [u_opt,lik] = stk_minimize_boxconstrained (algo, f, u_init, lb, ub) if nargin > 5 stk_error ('Too many input arguments.', 'TooManyInputArgs'); end [u_opt,lik] = fmincon (f, u_init, [], [], [], [], lb, ub, [], algo.options); end % function stk/inst/misc/optim/@stk_optim_fmincon/stk_optim_fmincon.m0000644000000000000000000000461613156161544021344 0ustar % STK_OPTIM_FMINCON constructs an object of class 'stk_optim_fmincon'. % % CALL: ALGO = stk_optim_fmincon () % % constructs an algorithm object ALGO of class 'stk_optim_fmincon' % with a default set of options. % % CALL: ALGO = stk_optim_fmincon (opt) % % constructs an algorithm object ALGO of class 'stk_optim_fmincon' % with a user-defined set of options, defined by the structure opt. % Copyright Notice % % Copyright (C) 2015-2017 CentraleSupelec % Copyright (C) 2014 SUPELEC & A. Ravisankar % % Authors: Julien Bect % Ashwin Ravisankar % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function algo = stk_optim_fmincon (varargin) % Some default options options = optimset ( ... 'Display', 'off', ... 'GradObj', 'on', ... 'MaxFunEvals', 500, ... 'TolFun', 1e-5, ... 'TolX', 1e-6 ); % The 'algorithm' option is not supported by optimset in Octave % (e.g., 4.0.0) and in some old versions of Matlab (e.g., r2007a) ws = warning ('off', 'all'); try % Try to use the interior-point algorithm, which has been % found to provide satisfactory results in many cases options = optimset (options, 'algorithm', 'interior-point'); end warning (ws); % TODO: see if the 'UseParallel' option can be useful % Take user options into account if nargin > 0 options = optimset (options, varargin{:}); end base = stk_optim_baseclass (true, false); algo = struct ('options', options); algo = class (algo, 'stk_optim_fmincon', base); end % function %!test stk_test_class ('stk_optim_fmincon') stk/inst/misc/optim/@stk_optim_fminsearch/0000755000000000000000000000000013156161544016123 5ustar stk/inst/misc/optim/@stk_optim_fminsearch/isequal.m0000644000000000000000000000277113156161544017753 0ustar % ISEQUAL [overload base function] % Copyright Notice % % Copyright (C) 2017 CentraleSupelec % Copyright (C) 2013, 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . % INTERNAL NOTE: overloaded for Octave 3.2.x compat / see CODING_GUIDELINES function b = isequal (x, y, varargin) if nargin < 2 stk_error ('Not enough input arguments.', 'NotEnoughInputArgs'); end % First, make sure that x and y belong to the same class % (either stk_dataframe or some derived class) b = isa (x, 'stk_optim_fminsearch') && strcmp (class (y), class (x)) ... && isequal (x.options, y.options); if b && (nargin > 2) b = isequal (x, varargin{:}); end end % function stk/inst/misc/optim/@stk_optim_fminsearch/stk_minimize_boxconstrained.m0000644000000000000000000000424613156161544024113 0ustar % STK_MINIMIZE_BOXCONSTRAINED [overload STK function] % % CALL: [U_OPT, LIK] = stk_minimize_boxconstrained (ALGO, F, U_INIT, LB, UB) % % NOTE % % This function simply ignores the bounds, since fminsearch does not handle % them. This is provided as a last recourse for Matlab users that have % neither the Optimization toolbox nor MOSEK. % Copyright Notice % % Copyright (C) 2017 CentraleSupelec % % Authors: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function [u_opt, lik] = stk_minimize_boxconstrained (algo, f, u_init, lb, ub) if nargin > 5 stk_error ('Too many input arguments.', 'TooManyInputArgs'); end persistent already_warned if isempty (already_warned) w_id = 'STK:stk_optim_fminsearch:stk_minimize_boxconstrained:BoxIgnored'; warning (['STK is going to use fminsearch for a box-constrained ' ... 'optimization problem. There is no guarantee that the solution ' ... 'will be inside the box. You should consider getting a proper ' ... 'box-constrained optimizer.']); % Even if the persistent gets cleared, don't display the warning again. % This trick allows us to avoid mlock'ing the file. warning ('off', w_id); already_warned = 1; end [u_opt, lik] = stk_minimize_unconstrained (algo, f, u_init); end % function %#ok<*INUSD> % lb and ub are ignored on purpose stk/inst/misc/optim/@stk_optim_fminsearch/stk_minimize_unconstrained.m0000644000000000000000000000345513156161544023746 0ustar % STK_MINIMIZE_UNCONSTRAINED performs unconstrained minimisation using fminsearch. % % CALL: U_OPT = stk_minimize_unconstrained (ALGO, F, U_INIT) % % estimates the parameters U_OPT without any bounds, which gives the minimum % value of the function F. A starting point U_INIT must be provided. % % CALL: [U_OPT, LIK] = stk_minimize_unconstrained (ALGO, F, U_INIT) % % also estimates the minimum function value LIK after the unconstrained % minimisation using fminsearch. % % NOTE: Here ALGO is an input argument to the function, that is an object of % class 'stk_optim_fminsearch'. % Copyright Notice % % Copyright (C) 2014 SUPELEC & A. Ravisankar % % Authors: Julien Bect % Ashwin Ravisankar % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function [u_opt,lik] = stk_minimize_unconstrained (algo, f, u_init) if nargin > 3 stk_error ('Too many input arguments.', 'TooManyInputArgs'); end [u_opt,lik] = fminsearch (f, u_init, algo.options); end % function stk/inst/misc/optim/@stk_optim_fminsearch/stk_optim_fminsearch.m0000644000000000000000000000373713156161544022523 0ustar % STK_OPTIM_FMINSEARCH constructs an object of class 'stk_optim_fminsearch'. % % CALL: ALGO = stk_optim_fminsearch () % % constructs an algorithm object ALGO of class 'stk_optim_fminsearch' % with a default set of options. % % CALL: X = stk_optim_fminsearch (opt) % % constructs an algorithm object ALGO of class 'stk_optim_fminsearch' % with a user-defined set of options, defined by the structure opt. % Copyright Notice % % Copyright (C) 2015-2017 CentraleSupelec % Copyright (C) 2014 SUPELEC & A. Ravisankar % % Authors: Julien Bect % Ashwin Ravisankar % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function algo = stk_optim_fminsearch (varargin) % Some default options options = optimset ( ... 'Display', 'off', ... 'MaxFunEvals', 500, ... 'TolFun', 1e-5, ... 'TolX', 1e-6 ); % Take user options into account if nargin > 0 options = optimset (options, varargin{:}); end base = stk_optim_baseclass (false, true); algo = struct ('options', options); algo = class (algo, 'stk_optim_fminsearch', base); end % function %!test stk_test_class ('stk_optim_fminsearch') stk/inst/misc/optim/@stk_optim_octavesqp/0000755000000000000000000000000013156161544016011 5ustar stk/inst/misc/optim/@stk_optim_octavesqp/isequal.m0000644000000000000000000000302213156161544017627 0ustar % ISEQUAL [overload base function] % Copyright Notice % % Copyright (C) 2017 CentraleSupelec % Copyright (C) 2013, 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . % INTERNAL NOTE: overloaded for Octave 3.2.x compat / see CODING_GUIDELINES function b = isequal (x, y, varargin) if nargin < 2 stk_error ('Not enough input arguments.', 'NotEnoughInputArgs'); end % First, make sure that x and y belong to the same class % (either stk_dataframe or some derived class) b = isa (x, 'stk_optim_octavesqp') && strcmp (class (y), class (x)) ... && isequal (x.options, y.options) && isequal (x.sqp, y.sqp); if b && (nargin > 2) b = isequal (x, varargin{:}); end end % function stk/inst/misc/optim/@stk_optim_octavesqp/private/0000755000000000000000000000000013156161544017463 5ustar stk/inst/misc/optim/@stk_optim_octavesqp/private/sqp_quadprog.m0000644000000000000000000005340313156161544022353 0ustar % -*- texinfo -*- % @deftypefn {Function File} {[@var{x}, @var{obj}, @var{info}, @var{iter}, @var{nf}, @var{lambda}] =} sqp (@var{x0}, @var{phi}) % @deftypefnx {Function File} {[@dots{}] =} sqp (@var{x0}, @var{phi}, @var{g}) % @deftypefnx {Function File} {[@dots{}] =} sqp (@var{x0}, @var{phi}, @var{g}, @var{h}) % @deftypefnx {Function File} {[@dots{}] =} sqp (@var{x0}, @var{phi}, @var{g}, @var{h}, @var{lb}, @var{ub}) % @deftypefnx {Function File} {[@dots{}] =} sqp (@var{x0}, @var{phi}, @var{g}, @var{h}, @var{lb}, @var{ub}, @var{maxiter}) % @deftypefnx {Function File} {[@dots{}] =} sqp (@var{x0}, @var{phi}, @var{g}, @var{h}, @var{lb}, @var{ub}, @var{maxiter}, @var{tol}) % Minimize an objective function using sequential quadratic programming (SQP). % % Solve the nonlinear program % @tex % $$ % \min_x \phi (x) % $$ % @end tex % @ifnottex % % @example % @group % min phi (x) % x % @end group % @end example % % @end ifnottex % subject to % @tex % $$ % g(x) = 0 \qquad h(x) \geq 0 \qquad lb \leq x \leq ub % $$ % @end tex % @ifnottex % % @example % @group % g(x) = 0 % h(x) >= 0 % lb <= x <= ub % @end group % @end example % % @end ifnottex % @noindent % using a sequential quadratic programming method. % % The first argument is the initial guess for the vector @var{x0}. % % The second argument is a function handle pointing to the objective function % @var{phi}. The objective function must accept one vector argument and % return a scalar. % % The second argument may also be a 2- or 3-element cell array of function % handles. The first element should point to the objective function, the % second should point to a function that computes the gradient of the % objective function, and the third should point to a function that computes % the Hessian of the objective function. If the gradient function is not % supplied, the gradient is computed by finite differences. If the Hessian % function is not supplied, a BFGS update formula is used to approximate the % Hessian. % % When supplied, the gradient function @code{@var{phi}@{2@}} must accept one % vector argument and return a vector. When supplied, the Hessian function % @code{@var{phi}@{3@}} must accept one vector argument and return a matrix. % % The third and fourth arguments @var{g} and @var{h} are function handles % pointing to functions that compute the equality constraints and the % inequality constraints, respectively. If the problem does not have % equality (or inequality) constraints, then use an empty matrix ([]) for % @var{g} (or @var{h}). When supplied, these equality and inequality % constraint functions must accept one vector argument and return a vector. % % The third and fourth arguments may also be 2-element cell arrays of % function handles. The first element should point to the constraint % function and the second should point to a function that computes the % gradient of the constraint function: % @tex % $$ % \Bigg( {\partial f(x) \over \partial x_1}, % {\partial f(x) \over \partial x_2}, \ldots, % {\partial f(x) \over \partial x_N} \Bigg)^T % $$ % @end tex % @ifnottex % % @example % @group % [ d f(x) d f(x) d f(x) ] % transpose ( [ ------ ----- ... ------ ] ) % [ dx_1 dx_2 dx_N ] % @end group % @end example % % @end ifnottex % The fifth and sixth arguments, @var{lb} and @var{ub}, contain lower and % upper bounds on @var{x}. These must be consistent with the equality and % inequality constraints @var{g} and @var{h}. If the arguments are vectors % then @var{x}(i) is bound by @var{lb}(i) and @var{ub}(i). A bound can also % be a scalar in which case all elements of @var{x} will share the same % bound. If only one bound (lb, ub) is specified then the other will % default to (-@var{realmax}, +@var{realmax}). % % The seventh argument @var{maxiter} specifies the maximum number of % iterations. The default value is 100. % % The eighth argument @var{tol} specifies the tolerance for the stopping % criteria. The default value is @code{sqrt (eps)}. % % The value returned in @var{info} may be one of the following: % % @table @asis % @item 101 % The algorithm terminated normally. % All constraints meet the specified tolerance. % % @item 102 % The BFGS update failed. % % @item 103 % The maximum number of iterations was reached. % % @item 104 % The stepsize has become too small, i.e., % @tex % $\Delta x,$ % @end tex % @ifnottex % delta @var{x}, % @end ifnottex % is less than @code{@var{tol} * norm (x)}. % @end table % % An example of calling @code{sqp}: % % @example % function r = g (x) % r = [ sum(abs(x).^2)-10; % x(2)*x(3)-5*x(4)*x(5); % x(1)^3+x(2)^3+1 ]; % end % function % % function obj = phi (x) % obj = exp (prod (x)) - 0.5*(x(1)^3+x(2)^3+1)^2; % end % function % % x0 = [-1.8; 1.7; 1.9; -0.8; -0.8]; % % [x, obj, info, iter, nf, lambda] = sqp (x0, @@phi, @@g, []) % % x = % % -1.71714 % 1.59571 % 1.82725 % -0.76364 % -0.76364 % % obj = 0.053950 % info = 101 % iter = 8 % nf = 10 % lambda = % % -0.0401627 % 0.0379578 % -0.0052227 % @end example % % @seealso{qp} % @end deftypefn % Copyright Notice % % Copyright (C) 2015 CentraleSupelec % % Author: Julien Bect % % This file is based on Octave's sqp function (distributed under the % GPLv3 licence) with minor modifications to be usable under Matlab. % The original copyright notice is as follows: % % Copyright (C) 2005-2015 John W. Eaton % Copyright (C) 2013-2015 Arun Giridhar % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . % Original Copying Permission Statement % % This file is part of Octave. % % Octave 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. % % Octave 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 Octave; see the file COPYING. If not, see % . function [x, obj, info, iter, nf, lambda] = sqp_quadprog ... (x0, objf, cef, cif, lb, ub, maxiter, tolerance) globals = struct (); % data and handles, needed and changed by subfunctions if (nargin < 2 || nargin > 8 || nargin == 5) print_usage (); end % if if (~ isvector (x0)) error ('sqp: X0 must be a vector'); end % if if (size (x0, 1) == 1) x0 = x0'; end % if have_hess = 0; if (iscell (objf)) switch (numel (objf)) case 1 obj_fun = objf{1}; obj_grd = @(x) fd_obj_grd (x, obj_fun); case 2 obj_fun = objf{1}; obj_grd = objf{2}; case 3 obj_fun = objf{1}; obj_grd = objf{2}; obj_hess = objf{3}; have_hess = 1; otherwise error ('sqp: invalid objective function specification'); end % switch else obj_fun = objf; % No cell array, only obj_fun set obj_grd = @(x) fd_obj_grd (x, obj_fun); end % if ce_fun = @empty_cf; ce_grd = @empty_jac; if (nargin > 2) if (iscell (cef)) switch (numel (cef)) case 1 ce_fun = cef{1}; ce_grd = @(x) fd_ce_jac (x, ce_fun); case 2 ce_fun = cef{1}; ce_grd = cef{2}; otherwise error ('sqp: invalid equality constraint function specification'); end % switch elseif (~ isempty (cef)) ce_fun = cef; % No cell array, only constraint equality function set ce_grd = @(x) fd_ce_jac (x, ce_fun); end % if end % if ci_fun = @empty_cf; ci_grd = @empty_jac; if (nargin > 3) % constraint function given by user with possible gradient globals.cif = cif; % constraint function given by user without gradient globals.cifcn = @empty_cf; if (iscell (cif)) if (length (cif) > 0) globals.cifcn = cif{1}; end % if elseif (~ isempty (cif)) globals.cifcn = cif; end % if if (nargin < 5 || (nargin > 5 && isempty (lb) && isempty (ub))) % constraint inequality function only without any bounds ci_grd = @(x) fd_ci_jac (x, globals.cifcn); if (iscell (cif)) switch (length (cif)) case 1 ci_fun = cif{1}; case 2 ci_fun = cif{1}; ci_grd = cif{2}; otherwise error ('sqp: invalid inequality constraint function specification'); end % switch elseif (~ isempty (cif)) ci_fun = cif; % No cell array, only constraint inequality function set end % if else % constraint inequality function with bounds present ub_idx = true (size (x0)); lb_idx = ub_idx; lb_grad = eye (size (x0, 1)); ub_grad = - lb_grad; if (isvector (lb)) tmp_lb = lb(:); globals.lb = tmp_lb; tmp_idx = (lb ~= -Inf); lb_idx(:) = tmp_idx; globals.lb = globals.lb(tmp_idx, 1); lb_grad = lb_grad(lb_idx, :); elseif (isempty (lb)) if (isa (x0, 'single')) tmp_lb = - realmax ('single'); globals.lb = tmp_lb; else tmp_lb = -realmax; globals.lb = tmp_lb; end % if else error ('sqp: invalid lower bound'); end % if if (isvector (ub)) tmp_ub = ub(:); globals.ub = tmp_ub; tmp_idx = (ub ~= Inf); ub_idx(:) = tmp_idx; globals.ub = globals.ub(tmp_idx, 1); ub_grad = ub_grad(ub_idx, :); elseif (isempty (ub)) if (isa (x0, 'single')) tmp_ub = realmax ('single'); globals.ub = tmp_ub; else tmp_ub = realmax; globals.ub = tmp_ub; end % if else error ('sqp: invalid upper bound'); end % if if (any (tmp_lb > tmp_ub)) error ('sqp: upper bound smaller than lower bound'); end % if bounds_grad = [lb_grad; ub_grad]; ci_fun = @(x) cf_ub_lb (x, lb_idx, ub_idx, globals); ci_grd = @(x) cigrad_ub_lb (x, bounds_grad, globals); end % if end % if % if (nargin > 3) iter_max = 100; if (nargin > 6 && ~ isempty (maxiter)) if (isscalar (maxiter) && maxiter > 0 && fix (maxiter) == maxiter) iter_max = maxiter; else error ('sqp: invalid number of maximum iterations'); end % if end % if tol = sqrt (eps); if (nargin > 7 && ~ isempty (tolerance)) if (isscalar (tolerance) && tolerance > 0) tol = tolerance; else error ('sqp: invalid value for TOLERANCE'); end % if end % if % Initialize variables for search loop % Seed x with initial guess and evaluate objective function, constraints, % and gradients at initial value x0. % % obj_fun -- objective function % obj_grad -- objective gradient % ce_fun -- equality constraint functions % ci_fun -- inequality constraint functions % A == [grad_{x_1} cx_fun, grad_{x_2} cx_fun, ..., grad_{x_n} cx_fun]^T x = x0; obj = feval (obj_fun, x0); globals.nfun = 1; c = feval (obj_grd, x0); % Choose an initial NxN symmetric positive definite Hessian approximation B. n = length (x0); if (have_hess) B = feval (obj_hess, x0); else B = eye (n, n); end % if ce = feval (ce_fun, x0); F = feval (ce_grd, x0); ci = feval (ci_fun, x0); C = feval (ci_grd, x0); A = [F; C]; % Choose an initial lambda (x is provided by the caller). lambda = 100 * ones (size (A, 1), 1); qp_iter = 1; alpha = 1; info = 0; % report (); % Called with no arguments to initialize reporting % report (iter, qp_iter, alpha, __sqp_nfun__, obj); for iter = 1:iter_max % FIXME in Octave -> shift by one (check iter_max = 1) ??? % Check convergence. This is just a simple check on the first % order necessary conditions. nr_f = size (F, 1); lambda_e = lambda((1:nr_f)'); lambda_i = lambda((nr_f+1:end)'); con = [ce; ci]; t0 = norm (c - A' * lambda); t1 = norm (ce); t2 = all (ci >= 0); t3 = all (lambda_i >= 0); t4 = norm (lambda .* con); % Normal convergence. All constraints are satisfied % and objective has converged. if (t2 && t3 && max ([t0; t1; t4]) < tol) info = 101; break; end % if % Compute search direction p by solving QP. g = -ce; d = -ci; % [p, obj_qp, INFO, lambda] = qp (x, B, c, F, g, [], [], d, C, ... % Inf (size (d))); B = 0.5 * (B + B'); % Prevents quadprog warning % Matlab's quadprog issues a warning when changing its default solver, % but we don't want to see that in the output of sqp. ws = warning ('off', 'all'); try % Call quadprog to solve the QP subproblem quadprog_options = optimset ('Display', 'off'); [p, ignd1, quadprog_exitflag, ignd2, lambda] = quadprog ... (B, c, -C, -d, F, g, [], [], x, quadprog_options); %#ok CG#07 catch warning (ws); rethrow (lasterror ()); end warning (ws); % Recreate a vector of Lagrange multipliers similar to qp's one lambda = [- lambda.eqlin; lambda.ineqlin]; % VERY crude processing of quadprog_exitflag if quadprog_exitflag <= 0 error ('quadprog failed to solve QP subproblem'); end % info = INFO.info; % % % FIXME: check QP solution and attempt to recover if it has failed. % % For now, just warn about possible problems. % % id = 'Octave:SQP-QP-subproblem'; % switch (info) % case 2 % warning (id, 'sqp: QP subproblem is non-convex and unbounded'); % case 3 % warning (id, 'sqp: QP subproblem failed to converge in %d iterations', ... % INFO.solveiter); % case 6 % warning (id, 'sqp: QP subproblem is infeasible'); % end % switch % Choose mu such that p is a descent direction for the chosen % merit function phi. [x_new, alpha, obj_new, globals] = ... linesearch_L1 (x, p, obj_fun, obj_grd, ce_fun, ci_fun, lambda, ... obj, globals); % Evaluate objective function, constraints, and gradients at x_new. c_new = feval (obj_grd, x_new); ce_new = feval (ce_fun, x_new); F_new = feval (ce_grd, x_new); ci_new = feval (ci_fun, x_new); C_new = feval (ci_grd, x_new); A_new = [F_new; C_new]; % Set % % s = alpha * p % y = grad_x L (x_new, lambda) - grad_x L (x, lambda}) y = c_new - c; if (~ isempty (A)) t = ((A_new - A)'*lambda); y = y - t; end % if delx = x_new - x; % Check if step size has become too small (indicates lack of progress). if (norm (delx) < tol * norm (x)) info = 104; break; end % if if (have_hess) B = feval (obj_hess, x); else % Update B using a quasi-Newton formula. delxt = delx'; % Damped BFGS. Or maybe we would actually want to use the Hessian % of the Lagrangian, computed directly? d1 = delxt*B*delx; t1 = 0.2 * d1; t2 = delxt*y; if (t2 < t1) theta = 0.8*d1/(d1 - t2); else theta = 1; end % if r = theta*y + (1-theta)*B*delx; d2 = delxt*r; % Check if the next BFGS update will work properly. % If d1 or d2 vanish, the BFGS update will fail. if (d1 == 0 || d2 == 0) info = 102; break; end % if B = B - B*delx*delxt*B/d1 + r*r'/d2; end % if x = x_new; obj = obj_new; c = c_new; ce = ce_new; F = F_new; ci = ci_new; C = C_new; A = A_new; % report (iter, qp_iter, alpha, __sqp_nfun__, obj); end % for % Check if we've spent too many iterations without converging. if (iter >= iter_max) info = 103; end % if nf = globals.nfun; end % function function [merit, obj, globals] = phi_L1 (obj, obj_fun, ce_fun, ci_fun, ... x, mu, globals) ce = feval (ce_fun, x); ci = feval (ci_fun, x); idx = ci < 0; con = [ce; ci(idx)]; if (isempty (obj)) obj = feval (obj_fun, x); globals.nfun = globals.nfun + 1; end % if merit = obj; t = norm (con, 1) / mu; if (~ isempty (t)) merit = merit + t; end % if end % function function [x_new, alpha, obj, globals] = ... linesearch_L1 (x, p, obj_fun, obj_grd, ce_fun, ci_fun, lambda, ... obj, globals) % Choose parameters % % eta in the range (0, 0.5) % tau in the range (0, 1) eta = 0.25; tau = 0.5; delta_bar = sqrt (eps); if (isempty (lambda)) mu = 1 / delta_bar; else mu = 1 / (norm (lambda, Inf) + delta_bar); end % if alpha = 1; c = feval (obj_grd, x); ce = feval (ce_fun, x); [phi_x_mu, obj, globals] = phi_L1 (obj, obj_fun, ce_fun, ci_fun, x, ... mu, globals); D_phi_x_mu = c' * p; d = feval (ci_fun, x); % only those elements of d corresponding % to violated constraints should be included. idx = d < 0; t = - norm ([ce; d(idx)], 1) / mu; if (~ isempty (t)) D_phi_x_mu = D_phi_x_mu + t; end % if while (1) [p1, obj, globals] = phi_L1 ([], obj_fun, ce_fun, ci_fun, ... x+alpha*p, mu, globals); p2 = phi_x_mu+eta*alpha*D_phi_x_mu; if (p1 > p2) % Reset alpha = tau_alpha * alpha for some tau_alpha in the % range (0, tau). tau_alpha = 0.9 * tau; % ?? alpha = tau_alpha * alpha; else break; end % if end % while x_new = x + alpha * p; end % function function grd = fdgrd (f, x) if (~ isempty (f)) y0 = feval (f, x); nx = length (x); grd = zeros (nx, 1); deltax = sqrt (eps); for i = 1:nx t = x(i); x(i) = x(i) + deltax; grd(i) = (feval (f, x) - y0) / deltax; x(i) = t; end % for else grd = zeros (0, 1); end % if end % function function jac = fdjac (f, x) nx = length (x); if (~ isempty (f)) y0 = feval (f, x); nf = length (y0); nx = length (x); jac = zeros (nf, nx); deltax = sqrt (eps); for i = 1:nx t = x(i); x(i) = x(i) + deltax; jac(:,i) = (feval (f, x) - y0) / deltax; x(i) = t; end % for else jac = zeros (0, nx); end % if end % function function grd = fd_obj_grd (x, obj_fun) grd = fdgrd (obj_fun, x); end % function function res = empty_cf (x) res = zeros (0, 1); end % function function res = empty_jac (x) res = zeros (0, length (x)); end % function function jac = fd_ce_jac (x, ce_fun) jac = fdjac (ce_fun, x); end % function function jac = fd_ci_jac (x, cifcn) % cifcn = constraint function without gradients and lb or ub jac = fdjac (cifcn, x); end % function function res = cf_ub_lb (x, lbidx, ubidx, globals) % combine constraint function with ub and lb if (isempty (globals.cifcn)) res = [x(lbidx,1)-globals.lb; globals.ub-x(ubidx,1)]; else res = [feval(globals.cifcn,x); x(lbidx,1)-globals.lb; globals.ub-x(ubidx,1)]; end % if end % function function res = cigrad_ub_lb (x, bgrad, globals) cigradfcn = @(x) fd_ci_jac (x, globals.cifcn); if (iscell (globals.cif) && length (globals.cif) > 1) cigradfcn = globals.cif{2}; end % if if (isempty (cigradfcn)) res = bgrad; else res = [feval(cigradfcn,x); bgrad]; end % if end % function % Utility function used to debug sqp function report (iter, qp_iter, alpha, nfun, obj) if (nargin == 0) printf (' Itn ItQP Step Nfun Objective\n'); else printf ('%5d %4d %8.1g %5d %13.6e\n', iter, qp_iter, alpha, nfun, obj); end % if end % function %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Test Code %!test if (exist ('quadprog', 'file') == 2) %! %! x0 = [-1.8; 1.7; 1.9; -0.8; -0.8]; %! %! [x, obj, info, iter, nf, lambda] = sqp_quadprog ... %! (x0, @sqp_quadprog_testf, @sqp_quadprog_testg, []); %! %! x_opt = [-1.717143501952599; %! 1.595709610928535; %! 1.827245880097156; %! -0.763643103133572; %! -0.763643068453300]; %! %! obj_opt = 0.0539498477702739; %! %! assert (stk_isequal_tolrel (x, x_opt, 8 * sqrt (eps))); %! assert (stk_isequal_tolrel (obj, obj_opt, sqrt (eps))); %! %! end % Test input validation %!error sqp_quadprog () %!error sqp_quadprog (1) %!error sqp_quadprog (1,2,3,4,5,6,7,8,9) %!error sqp_quadprog (1,2,3,4,5) %!error sqp_quadprog (ones (2,2)) %!error sqp_quadprog (1, cell (4,1)) %!error sqp_quadprog (1, cell (3,1), cell (3,1)) %!error sqp_quadprog (1, cell (3,1), cell (2,1), cell (3,1)) %!error sqp_quadprog (1, cell (3,1), cell (2,1), cell (2,1), ones (2,2),[]) %!error sqp_quadprog (1, cell (3,1), cell (2,1), cell (2,1),[], ones (2,2)) %!error sqp_quadprog (1, cell (3,1), cell (2,1), cell (2,1),1,-1) %!error sqp_quadprog (1, cell (3,1), cell (2,1), cell (2,1),[],[], ones (2,2)) %!error sqp_quadprog (1, cell (3,1), cell (2,1), cell (2,1),[],[],-1) %!error sqp_quadprog (1, cell (3,1), cell (2,1), cell (2,1),[],[],1.5) %!error sqp_quadprog (1, cell (3,1), cell (2,1), cell (2,1),[],[],[], ones (2,2)) %!error sqp_quadprog (1, cell (3,1), cell (2,1), cell (2,1),[],[],[],-1) stk/inst/misc/optim/@stk_optim_octavesqp/private/sqp_quadprog_testf.m0000644000000000000000000000015313156161544023552 0ustar function obj = sqp_quadprog_testf (x) obj = exp (prod (x)) - 0.5*(x(1)^3 + x(2)^3 + 1)^2; end % function stk/inst/misc/optim/@stk_optim_octavesqp/private/sqp_quadprog_testg.m0000644000000000000000000000020713156161544023553 0ustar function r = sqp_quadprog_testg (x) r = [sum(abs(x).^2)-10; ... x(2)*x(3)-5*x(4)*x(5); ... x(1)^3+x(2)^3+1 ]; end % function stk/inst/misc/optim/@stk_optim_octavesqp/stk_minimize_boxconstrained.m0000644000000000000000000000432713156161544024001 0ustar % STK_MINIMIZE_BOXCONSTRAINED performs boxconstrained minimisation using sqp. % % CALL: U_OPT = stk_minimize_boxconstrained (ALGO, F, U_INIT, LB, UB) % % estimates the parameters U_OPT within the user-defined lowerbounds LB % and upper bounds UB, which gives the minimum value of the function F. A % starting point U_INIT must be provided. % % CALL: [U_OPT, LIK] = stk_minimize_boxconstrained (ALGO, F, U_INIT, LB, UB) % % also estimates the minimum function value LIK after the boxconstrained % minimisation using sqp. % % NOTE: Here ALGO is an input argument to the function, that is an object of % class 'stk_optim_octavesqp'. % Copyright Notice % % Copyright (C) 2015 CentraleSupelec % Copyright (C) 2014 SUPELEC & A. Ravisankar % % Authors: Julien Bect % Ashwin Ravisankar % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function [u_opt,lik] = stk_minimize_boxconstrained (algo, f, u_init, lb, ub) if nargin>5 stk_error ('Too many input arguments.', 'TooManyInputArgs'); end nabla_f = @(u)(nabla_f_ (f, u)); [u_opt,lik] = feval (algo.sqp, u_init, {f nabla_f}, [] , [], lb, ub, ... algo.options.maxiter, algo.options.tol); end % function function df = nabla_f_ (f, u) % Note: with this implementation, f_val is computed twice % (once when f is called by sqp, and once again when nabla_f is called) [ignd, df] = f (u); %#ok CG#07 end % function stk/inst/misc/optim/@stk_optim_octavesqp/stk_minimize_unconstrained.m0000644000000000000000000000347013156161544023631 0ustar % STK_MINIMIZE_UNCONSTRAINED performs unconstrained minimisation using sqp. % % CALL: U_OPT = stk_minimize_unconstrained (ALGO, F, U_INIT) % % estimates the parameters U_OPT without any bounds, which gives the minimum % value of the function F. A starting point U_INIT must be provided. % % CALL: [U_OPT, LIK] = stk_minimize_unconstrained (ALGO, F, U_INIT) % % also estimates the minimum function value LIK after the unconstrained % minimisation using sqp. % % NOTE: Here ALGO is an input argument to the function, that is an object of % class 'stk_optim_octavesqp'. % Copyright Notice % % Copyright (C) 2014 SUPELEC & A. Ravisankar % % Authors: Julien Bect % Ashwin Ravisankar % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function [u_opt,lik] = stk_minimize_unconstrained (algo, f, u_init) if nargin > 3 stk_error ('Too many input arguments.', 'TooManyInputArgs'); end [u_opt, lik] = stk_minimize_boxconstrained (algo, f, u_init, [], []); end % function stk/inst/misc/optim/@stk_optim_octavesqp/stk_optim_octavesqp.m0000644000000000000000000000657013156161544022275 0ustar % STK_OPTIM_OCTAVESQP constructs an object of class 'stk_optim_octavesqp'. % % CALL: ALGO = stk_optim_octavesqp () % % constructs an algorithm object ALGO of class 'stk_optim_octavesqp' % with a default set of options. % % CALL: ALGO = stk_optim_octavesqp (opt) % % constructs an algorithm object ALGO of class 'stk_optim_octavesqp' % with a user-defined set of options, defined by the structure opt. % Copyright Notice % % Copyright (C) 2015-2017 CentraleSupelec % Copyright (C) 2014 SUPELEC & A. Ravisankar % % Authors: Julien Bect % Ashwin Ravisankar % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function algo = stk_optim_octavesqp (user_options) if nargin > 1 stk_error ('Too many input arguments.', 'TooManyInputArgs'); end % Default options options.maxiter = 500; % Octave's default is 100 options.tol = sqrt (eps); % This is Octave's default options.qp_solver = []; % We provide a default choice below, if needed % Process user options if nargin > 0 fn = fieldnames (user_options); for i = 1:(numel (fn)) switch lower (fn{i}) case 'maxiter' options.maxiter = user_options.maxiter; case 'tol' options.tol = user_options.tol; case 'qp_solver' options.qp_solver = user_options.qp_solver; otherwise stk_error (sprintf ('Unknown option: %s.\n',fn{i}), ... 'InvalidArgument'); end end end % Provide default QP solver if needed if isempty (options.qp_solver) if exist ('OCTAVE_VERSION', 'builtin') == 5 % Octave % Octave's core qp function options.qp_solver = 'qp'; else % quadprog from Mathworks' Optimization toolbox or from MOSEK options.qp_solver = 'quadprog'; end end % Choose the appropriate optimizer, depending on the value of qp_solver switch options.qp_solver case 'qp' optimizer = 'sqp'; case 'quadprog' optimizer = 'sqp_quadprog'; otherwise stk_error (sprintf (['Incorrect value for option qp_solver %s.\n\n' ... 'qp_solver must be either ''qp'' or ''quadprog''.\n'], ... options.qp_solver), 'InvalidArgument'); end % Note: do NOT rewrite to use handles instead of strings for optimizer % (see bug report https://savannah.gnu.org/bugs/index.php?47828) base = stk_optim_baseclass (true, true); algo = struct ('options', options, 'sqp', optimizer); algo = class (algo, 'stk_optim_octavesqp', base); end % function %!test stk_test_class ('stk_optim_octavesqp') stk/inst/misc/optim/stk_minimize_boxconstrained.m0000644000000000000000000000564713156161544017611 0ustar % STK_MINIMIZE_BOXCONSTRAINED performs box-constrained minimization % % CALL: U_OPT = stk_minimize_boxconstrained (ALGO, F, U_INIT, LB, UB) % % minimizes the objective function F between LB and UB, using algorithm % ALGO with starting point U_INIT. The best point found by the algorithm is % returned as U_OPT. The value of ALGO can be 'fmincon', 'octavesqp', or any % algorithm object implementing the 'stk_minimize_boxconstrained' method. % % CALL: [U_OPT, F_OPT] = stk_minimize_boxconstrained (ALGO, F, U_INIT, LB, UB) % % also returns the best objective value F_OPT. % % See also stk_minimize_unconstrained, stk_optim_octavesqp, stk_optim_fmincon % Copyright Notice % % Copyright (C) 2016, 2017 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function varargout = stk_minimize_boxconstrained (algo, varargin) switch algo case 'fmincon' algo = stk_optim_fmincon (); case 'octavesqp' algo = stk_optim_octavesqp (); otherwise stk_error (['The first input argument should be an algorithm ' ... 'object, implementing the stk_minimize_boxconstrained ', ... 'method.'], 'InvalidArgument'); end varargout = cell (1, max (1, nargout)); [varargout{:}] = stk_minimize_boxconstrained (algo, varargin{:}); end % function %!test % Call fmincon using function name %! if stk_optim_isavailable ('fmincon') %! assert (stk_optim_testmin_box ('fmincon')); %! end %!test % Call fmincon directly, using algorithm object %! if stk_optim_isavailable ('fmincon') %! algo = stk_optim_fmincon ('TolX', 1e-12, 'TolFun', 1e-12); %! assert (stk_optim_testmin_box (algo)); %! end %!test % Call sqp using function name %! if stk_optim_isavailable ('octavesqp') %! assert (stk_optim_testmin_box ('octavesqp')); %! end %!test % Call sqp directly, using algorithm object %! if stk_optim_isavailable ('octavesqp') %! algo = stk_optim_octavesqp (); %! assert (stk_optim_testmin_box (algo)); %! end %!error assert (stk_optim_testmin_box ('InexistentOptimizer')); %!error assert (stk_optim_testmin_box (100)); stk/inst/misc/optim/stk_minimize_unconstrained.m0000644000000000000000000000562313156161544017435 0ustar % STK_MINIMIZE_UNCONSTRAINED performs unconstrained minimization % % CALL: U_OPT = stk_minimize_unconstrained (ALGO, F, U_INIT) % % minimizes the objective function F, using algorithm ALGO with starting % point U_INIT. The best point found by the algorithm is returned as U_OPT. % The value of ALGO can be 'fminsearch', 'octavesqp', or any algorithm object % implementing the 'stk_minimize_boxconstrained' method. % % CALL: [U_OPT, F_OPT] = stk_minimize_unconstrained (ALGO, F, U_INIT) % % also returns the best objective value F_OPT. % % See also stk_minimize_boxconstrained, stk_optim_octavesqp, stk_optim_fminsearch % Copyright Notice % % Copyright (C) 2016, 2017 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function varargout = stk_minimize_unconstrained (algo, varargin) switch algo case 'fminsearch' algo = stk_optim_fminsearch (); case 'octavesqp' algo = stk_optim_octavesqp (); otherwise stk_error (['The first input argument should be an algorithm ' ... 'object, implementing the stk_minimize_unconstrained ', ... 'method.'], 'InvalidArgument'); end varargout = cell (1, max (1, nargout)); [varargout{:}] = stk_minimize_unconstrained (algo, varargin{:}); end % function %!test % Call fminsearch using function name %! if stk_optim_isavailable ('fminsearch') %! assert (stk_optim_testmin_unc ('fminsearch')); %! end %!test % Call fminsearch directly, using algorithm object %! if stk_optim_isavailable ('fminsearch') %! algo = stk_optim_fminsearch ('TolX', 1e-12, 'TolFun', 1e-12); %! assert (stk_optim_testmin_unc (algo)); %! end %!test % Call sqp using function name %! if stk_optim_isavailable ('octavesqp') %! assert (stk_optim_testmin_unc ('octavesqp')); %! end %!test % Call sqp directly, using algorithm object %! if stk_optim_isavailable ('octavesqp') %! algo = stk_optim_octavesqp (); %! assert (stk_optim_testmin_unc (algo)); %! end %!error assert (stk_optim_testmin_unc ('InexistentOptimizer')); %!error assert (stk_optim_testmin_unc (100)); stk/inst/misc/optim/stk_optim_isavailable.m0000644000000000000000000000352213156161544016340 0ustar % STK_OPTIM_ISAVAILABLE checks if a given optimizer is available % % CALL: B = stk_optim_isavailable (ALGO) % % return true is ALGO is available, and false otherwise. ALGO can be the % short name of an algorithm (such as 'octavesqp'), the corresponding class % name (such as 'stk_optim_octavesqp'), a handle on the class constructor % (such as @stk_optim_octavesqp) or an algorithm object. % Copyright Notice % % Copyright (C) 2017 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function b = stk_optim_isavailable (algo, varargin) switch algo case 'fmincon' A = stk_optim_fmincon (varargin{:}); case 'fminsearch' A = stk_optim_fminsearch (varargin{:}); case 'octavesqp' A = stk_optim_octavesqp (varargin{:}); otherwise try A = feval (algo, varargin{:}); catch stk_error ('Invalid input argument', 'InvalidArgument'); end end b = stk_optim_isavailable (A); end % function stk/inst/misc/optim/stk_optim_testmin_box.m0000644000000000000000000000402513156161544016416 0ustar % STK_OPTIM_TESTMIN_BOX [STK internal] % Copyright Notice % % Copyright (C) 2015, 2016 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function b = stk_optim_testmin_box (algo) if nargin == 1 try % Starting point x_init = 0.0; % Bounds lb = -1.0; ub = 0.1; [x_opt, obj_opt] = stk_minimize_boxconstrained ... (algo, @objfun, x_init, lb, ub); assert (abs (x_opt - 0.1) < 1e-2); assert (abs (obj_opt - 0.04) < 1e-2); b = true; catch %#ok b = false; end % try_catch elseif nargin == 0 stk_error ('Not enough input arguments.', 'NotEnoughInputArgs'); elseif nargin > 1 stk_error ('Too many input arguments.', 'TooManyInputArgs'); end % if end % function function [f, df] = objfun (x) f = (x - 0.3) .^ 2; df = 2 * (x - 0.3); end % function %!shared algo %! algo = stk_options_get ('stk_param_estim', 'minimize_box'); %!error b = stk_optim_testmin_box (); %!error b = stk_optim_testmin_box (algo, 33.51); %!assert (stk_optim_testmin_box (algo)); %!assert (~ stk_optim_testmin_box ('dudule')); stk/inst/misc/optim/stk_optim_testmin_unc.m0000644000000000000000000000367613156161544016426 0ustar % STK_OPTIM_TESTMIN_UNC [STK internal] % Copyright Notice % % Copyright (C) 2015, 2016 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function b = stk_optim_testmin_unc (algo) if nargin == 1 try % Starting point x_init = 0.0; [x_opt, obj_opt] = stk_minimize_unconstrained (algo, @objfun, x_init); assert (abs (x_opt - 0.3) < 1e-2); assert (abs (obj_opt - 0.0) < 1e-2); b = true; catch %#ok b = false; end % try_catch elseif nargin == 0 stk_error ('Not enough input arguments.', 'NotEnoughInputArgs'); elseif nargin > 1 stk_error ('Too many input arguments.', 'TooManyInputArgs'); end % if end % function function [f, df] = objfun (x) f = (x - 0.3) .^ 2; df = 2 * (x - 0.3); end % function %!shared algo %! algo = stk_options_get ('stk_param_estim', 'minimize_unc'); %!error b = stk_optim_testmin_unc (); %!error b = stk_optim_testmin_unc (algo, 33.51); %!assert (stk_optim_testmin_unc (algo)); %!assert (~ stk_optim_testmin_unc ('dudule')); stk/inst/misc/optim/stk_select_optimizer.m0000644000000000000000000000564713156161544016247 0ustar % STK_SELECT_OPTIMIZER is a deprecated function % % stk_select_optimizer is deprecated and will be removed % from future releases of STK. Use % % stk_options_get ('stk_param_estim', ...) % stk_options_set ('stk_param_estim', ...) % % instead to get/set optimizer algorithm objects. % % See also: stk_options_get, stk_options_set % Copyright Notice % % Copyright (C) 2015 CentraleSupelec % Copyright (C) 2011-2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function optim_num = stk_select_optimizer (bounds_available, display) warning (help ('stk_select_optimizer')); % Get current optimization algorithm objects algo_con = stk_options_get ('stk_param_estim', 'stk_minimize_boxconstrained'); algo_unc = stk_options_get ('stk_param_estim', 'stk_minimize_unconstrained'); % Legacy: corresponding optim_num in stk <= 2.3.2 optim_num_con = get_optim_num (algo_con); optim_num_unc = get_optim_num (algo_unc); % Return value if nargin > 0 if bounds_available, optim_num = optim_num_con; else optim_num = optim_num_unc; end else optim_num = []; end % Display status if (nargin > 1) && display, fprintf ('Constrained optimizer for stk_param_estim: '); switch optim_num_con case 1, % octave / sqp fprintf ('sqp.\n'); case 2, % Matlab / fminsearch fprintf ('NONE.\n'); case 3, % Matlab / fmincon fprintf ('fmincon.\n'); otherwise fprintf ('%s\n', class (algo_con)); end fprintf ('Unconstrained optimizer for stk_param_estim: '); switch optim_num_unc case 1, % octave / sqp fprintf ('sqp.\n'); case 2, % Matlab / fminsearch fprintf ('fminsearch.\n'); otherwise fprintf ('%s\n', class (algo_unc)); end end end % function function optim_num = get_optim_num (algo) switch class (algo) case 'stk_optim_octavesqp' optim_num = 1; case 'stk_optim_fminsearch' optim_num = 2; case 'stk_optim_fmincon' optim_num = 3; otherwise optim_num = []; end end % function stk/inst/misc/options/0000755000000000000000000000000013156161544012156 5ustar stk/inst/misc/options/stk_options_get.m0000644000000000000000000000567413156161544015563 0ustar % STK_OPTIONS_GET returns the value of one or all STK options % Copyright Notice % % Copyright (C) 2016 CentraleSupelec % Copyright (C) 2013, 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function argout = stk_options_get (varargin) opts = stk_options_set (); switch nargin case 0, % nothing to do, just return the output argout = opts; case 1, switch varargin{1} case 'stk_sf_matern' % TODO: Remove this warning in STK 3.x warning (sprintf([ ... 'stk_sf_matern and the corresponding options have been ' ... 'deprecated.\n\nPlease use stk_rbf_matern instead.\n'])); argout = options.stk_rbf_matern; otherwise argout = opts.(varargin{1}); end case 2, switch varargin{1} case 'stk_param_estim' if strcmp (varargin{2}, 'optim_display_level') % TODO: Remove this error in STK 3.x error (sprintf ([ ... 'Options stk_param_estim.optim_display_level has ' ... 'been removed.\n\nDisplay options for optimization ' ... 'algorithms can be set through the properties of ' ... 'the algorithm objects instead.\n'])); else argout = opts.stk_param_estim.(varargin{2}); end case 'stk_sf_matern' % TODO: Remove this warning in STK 3.x warning (sprintf([ ... 'stk_sf_matern and the corresponding options have been ' ... 'deprecated.\n\nPlease use stk_rbf_matern instead.\n'])); argout = options.stk_rbf_matern.(varargin{2}); otherwise argout = opts.(varargin{1}).(varargin{2}); end otherwise stk_error ('Too many input arguments.', 'TooManyInputArgs'); end end % function %#ok<*SPWRN,*SPERR> stk/inst/misc/options/stk_options_set.m0000644000000000000000000001254413156161544015571 0ustar % STK_OPTIONS_SET sets the value of one or all STK options % Copyright Notice % % Copyright (C) 2015-2017 CentraleSupelec % Copyright (C) 2014 SUPELEC & A. Ravisankar % Copyright (C) 2013 SUPELEC % % Authors: Julien Bect % Ashwin Ravisankar % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function opts = stk_options_set (varargin) persistent options if isempty (options) options = init_options (); mlock; end switch nargin case 0 % nothing to do, just return the output case 1 % reset if (ischar (varargin{1})) && strcmp (varargin{1}, 'default') options = init_options (); else stk_error ('Syntax error', 'SyntaxError'); end case 2 switch varargin{1} case 'stk_sf_matern' % TODO: Remove this warning in STK 3.x warning (sprintf([ ... 'stk_sf_matern and the corresponding options have been ' ... 'deprecated.\n\nPlease use stk_rbf_matern instead.\n'])); options.stk_rbf_matern = varargin{2}; otherwise options.(varargin{1}) = varargin{2}; end case 3 switch varargin{1} case 'stk_param_estim' if strcmp (varargin{2}, 'optim_display_level') % TODO: Remove this warning in STK 3.x warning (sprintf ([ ... 'Options stk_param_estim.optim_display_level has ' ... 'been removed.\n\nDisplay options for optimization ' ... 'algorithms can be set through the properties of ' ... 'the algorithm objects instead.\n'])); else options.stk_param_estim.(varargin{2}) = varargin{3}; end case 'stk_sf_matern' % TODO: Remove this warning in STK 3.x warning (sprintf([ ... 'stk_sf_matern and the corresponding options have been ' ... 'deprecated.\n\nPlease use stk_rbf_matern instead.\n'])); options.stk_rbf_matern.(varargin{2}) = varargin{3}; otherwise options.(varargin{1}).(varargin{2}) = varargin{3}; end otherwise stk_error ('Incorrect number of input arguments.', 'SyntaxError'); end opts = options; end % function %#ok<*CTCH,*SPWRN> function opts = init_options () opts = struct (); opts.stk_rbf_matern.min_size_for_parallelization = 1e5; opts.stk_rbf_matern.min_block_size = 1e3; opts.stk_dataframe.disp_format = 'basic'; % 'basic' or 'verbose' opts.stk_dataframe.disp_spstr = ' '; opts.stk_dataframe.openvar_warndlg = true; opts.stk_param_getdefaultbounds.tolvar = 5.0; opts.stk_param_getdefaultbounds.tolscale = 5.0; opts.stk_figure.properties = {'InvertHardcopy', 'off', 'Color', [1 1 1]}; opts.stk_xlabel.properties = {'FontSize', 10, 'Color', [0.2 0 1]}; opts.stk_ylabel.properties = opts.stk_xlabel.properties; opts.stk_zlabel.properties = opts.stk_xlabel.properties; opts.stk_title.properties = {'FontSize', 10, 'FontWeight', 'bold'}; opts.stk_axes.properties = {'FontSize', 8}; % Select optimizer for stk_param_estim if exist ('OCTAVE_VERSION', 'builtin') == 5 % In Octave we use sqp (which is always available) in both cases opts.stk_param_estim.minimize_box = stk_optim_octavesqp (); opts.stk_param_estim.minimize_unc = stk_optim_octavesqp (); else A_fminsearch = stk_optim_fminsearch (); try % See if the Mathworks' Optimization toolbox is installed opts.stk_param_estim.minimize_box = stk_optim_fmincon (); opts.stk_param_estim.minimize_unc = A_fminsearch; % FIXME: use fminunc ! check_both (opts.stk_param_estim); catch try % See sqp can be used with MOSEK's quadprog % (or any other compatible replacement for quadprog) A = stk_optim_octavesqp (struct ('qp_solver', 'quadprog')); opts.stk_param_estim.minimize_box = A; opts.stk_param_estim.minimize_unc = A; check_both (opts.stk_param_estim); catch opts.stk_param_estim.minimize_box = A_fminsearch; opts.stk_param_estim.minimize_unc = A_fminsearch; end end end end % function function check_both (opts) assert (stk_optim_testmin_box (opts.minimize_box)); assert (stk_optim_testmin_unc (opts.minimize_unc)); end % function stk/inst/misc/parallel/0000755000000000000000000000000013156161544012257 5ustar stk/inst/misc/parallel/@stk_parallel_engine_none/0000755000000000000000000000000013156161544017400 5ustar stk/inst/misc/parallel/@stk_parallel_engine_none/isequal.m0000644000000000000000000000272313156161544021225 0ustar % ISEQUAL [overload base function] % Copyright Notice % % Copyright (C) 2017 CentraleSupelec % Copyright (C) 2013, 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . % INTERNAL NOTE: overloaded for Octave 3.2.x compat / see CODING_GUIDELINES function b = isequal (x, y, varargin) if nargin < 2 stk_error ('Not enough input arguments.', 'NotEnoughInputArgs'); end % First, make sure that x and y belong to the same class % (either stk_dataframe or some derived class) b = isa (x, 'stk_parallel_engine_none') && strcmp (class (y), class (x)); if b && (nargin > 2) b = isequal (x, varargin{:}); end end % function stk/inst/misc/parallel/@stk_parallel_engine_none/stk_parallel_engine_none.m0000644000000000000000000000227413156161544024604 0ustar % STK_PARALLEL_ENGINE_NONE [overload STK function] % Copyright Notice % % Copyright (C) 2017 CentraleSupelec % Copyright (C) 2013 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function pareng = stk_parallel_engine_none() pareng = class(struct(), 'stk_parallel_engine_none'); end % function %!test stk_test_class ('stk_parallel_engine_none') stk/inst/misc/parallel/@stk_parallel_engine_none/stk_parallel_feval.m0000644000000000000000000000260313156161544023411 0ustar % STK_PARALLEL_FEVAL [overload STK function] % Copyright Notice % % Copyright (C) 2013 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function z = stk_parallel_feval(eng, f, x, vectorized, min_block_size) % TODO: remplacer vectorized par max_block_size ? if vectorized % STK-style vectorization supported z = feval(f, x); else % STK-style vectorization not supported => loop over the rows of x n = size(x, 1); z = zeros(n, 1); parfor i = 1:n, z(i) = feval(f, x(i, :)); end end end % function stk/inst/misc/parallel/@stk_parallel_engine_none/stk_parallel_stop.m0000644000000000000000000000206313156161544023301 0ustar % STK_PARALLEL_STOP [overload STK function] % Copyright Notice % % Copyright (C) 2013 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function stk_parallel_stop(eng) %#ok % nothing to do ! end % function stk/inst/misc/parallel/@stk_parallel_engine_parfor/0000755000000000000000000000000013156161544017732 5ustar stk/inst/misc/parallel/@stk_parallel_engine_parfor/isequal.m0000644000000000000000000000272513156161544021561 0ustar % ISEQUAL [overload base function] % Copyright Notice % % Copyright (C) 2017 CentraleSupelec % Copyright (C) 2013, 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . % INTERNAL NOTE: overloaded for Octave 3.2.x compat / see CODING_GUIDELINES function b = isequal (x, y, varargin) if nargin < 2 stk_error ('Not enough input arguments.', 'NotEnoughInputArgs'); end % First, make sure that x and y belong to the same class % (either stk_dataframe or some derived class) b = isa (x, 'stk_parallel_engine_parfor') && strcmp (class (y), class (x)); if b && (nargin > 2) b = isequal (x, varargin{:}); end end % function stk/inst/misc/parallel/@stk_parallel_engine_parfor/stk_parallel_engine_parfor.m0000644000000000000000000000327513156161544025472 0ustar % STK_PARALLEL_ENGINE_PARFOR [overload STK function] % Copyright Notice % % Copyright (C) 2017 CentraleSupelec % Copyright (C) 2013 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function pareng = stk_parallel_engine_parfor() if exist ('parpool') try parpool (); catch e = lasterror (); if strfind (e.identifier, 'ConnectionOpen') warning ('A worker pool is already open.'); else rethrow (e); end end else % try the old syntax if matlabpool ('size') > 0 warning ('A worker pool is already open.'); else matlabpool open; end end pareng = class (struct(), 'stk_parallel_engine_parfor'); end % function %#ok<*DPOOL> %!test %! if exist ('matlabpool') || exist ('parpool') %! stk_test_class ('stk_parallel_engine_parfor') %! end stk/inst/misc/parallel/@stk_parallel_engine_parfor/stk_parallel_feval.m0000644000000000000000000000321613156161544023744 0ustar % STK_PARALLEL_FEVAL [overload STK function] % Copyright Notice % % Copyright (C) 2013 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function z = stk_parallel_feval(eng, f, x, vectorized, min_block_size) % TODO: remplacer vectorized par max_block_size ? if vectorized % STK-style vectorization supported ncores = max(1, matlabpool('size')); blocks = stk_parallel_cutblocks(x, ncores, min_block_size); nb_blocks = length(blocks); z = cell(nb_blocks, 1); parfor b = 1:nb_blocks, z{b} = feval(f, blocks(b).xi); end z = vertcat(z{:}); else % STK-style vectorization not supported => loop over the rows of x n = size(x, 1); z = zeros(n, 1); parfor i = 1:n, z(i) = feval(f, x(i, :)); end end end % function stk/inst/misc/parallel/@stk_parallel_engine_parfor/stk_parallel_stop.m0000644000000000000000000000230513156161544023632 0ustar % STK_PARALLEL_STOP [overload STK function] % Copyright Notice % % Copyright (C) 2013 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function stk_parallel_stop(eng) %#ok if matlabpool('size') == 0, warning('There was no worker pool open.'); else matlabpool close; end stk_parallel_engine_set(stk_parallel_engine_none()); end % function stk/inst/misc/parallel/stk_parallel_cutblocks.m0000644000000000000000000000324513156161544017167 0ustar % STK_PARALLEL_CUTBLOCKS [STK internal] % Copyright Notice % % Copyright (C) 2013 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function blocks = stk_parallel_cutblocks(x, ncores, min_block_size) x = double(x); n = size(x, 1); %--- Choose the actual block size & number of blocks ---------------------------- nb_blocks = min(ncores, max(1, floor(n / min_block_size))); block_size = ceil(n / nb_blocks); %--- Cut blocks ----------------------------------------------------------------- ind1 = 1 + ((1:nb_blocks)' - 1) * block_size; ind2 = min(n, ind1 + block_size - 1); % note: the last blocks can be slightly smaller than the others blocks = struct('i', cell(1, nb_blocks), 'j', [], 'xi', [], 'K', []); for b = 1:nb_blocks, blocks(b).i = ind1(b):ind2(b); blocks(b).xi = x(blocks(b).i, :); end end % function stk/inst/misc/parallel/stk_parallel_engine_get.m0000644000000000000000000000213713156161544017301 0ustar % STK_PARALLEL_ENGINE_GET returns the current parallelization engine. % Copyright Notice % % Copyright (C) 2013 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function pareng = stk_parallel_engine_get() pareng = stk_parallel_engine_set(); end % function stk/inst/misc/parallel/stk_parallel_engine_set.m0000644000000000000000000000266713156161544017325 0ustar % STK_PARALLEL_ENGINE_SET chooses a parallelization engine. % Copyright Notice % % Copyright (C) 2013 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function pareng = stk_parallel_engine_set(new_pareng) persistent current_pareng % initialization if isempty(current_pareng) % no parallel engine, to begin with current_pareng = stk_parallel_engine_none(); % lock the mfile in memory to prevent current_pareng from being cleared mlock(); end if nargin > 0, current_pareng = new_pareng; end % Return the current parallel engine pareng = current_pareng; end % function stk/inst/misc/parallel/stk_parallel_feval.m0000644000000000000000000000237513156161544016276 0ustar % STK_PARALLEL_FEVAL does parallel evaluations of a function. % Copyright Notice % % Copyright (C) 2013 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function z = stk_parallel_feval(f, x, vectorized, min_block_size) if nargin < 3, vectorized = true; end if nargin < 4, min_block_size = 1; end z = stk_parallel_feval(stk_parallel_engine_get(), ... f, x, vectorized, min_block_size); end % function stk/inst/misc/parallel/stk_parallel_start.m0000644000000000000000000000307013156161544016327 0ustar % STK_PARALLEL_START starts the parallelization engine. % Copyright Notice % % Copyright (C) 2017 CentraleSupelec % Copyright (C) 2013, 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function eng = stk_parallel_start () eng = stk_parallel_engine_get (); if strcmp (class (eng), 'stk_parallel_engine_none') %#ok % use Mathworks' PCT if available if (exist ('OCTAVE_VERSION', 'builtin') ~= 5) ... % no Octave && (exist ('matlabpool', 'file')) eng = stk_parallel_engine_parfor (); stk_parallel_engine_set (eng); end else warning (['A parallel computing engine ' ... 'is already started (or so it seems).']); %#ok end end % function stk/inst/misc/parallel/stk_parallel_stop.m0000644000000000000000000000211513156161544016156 0ustar % STK_PARALLEL_STOP stops the parallelization engine. % Copyright Notice % % Copyright (C) 2013 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function stk_parallel_stop () stk_parallel_stop (stk_parallel_engine_get ()); end % function stk/inst/misc/pareto/0000755000000000000000000000000013156161544011755 5ustar stk/inst/misc/pareto/stk_dominatedhv.m0000644000000000000000000002565113156161544015327 0ustar % STK_DOMINATEHV computes the hypervolume dominated by a set of points % % CALL: HV = stk_dominatedhv (Y, Y_REF) % CALL: HV = stk_dominatedhv (Y, Y_REF, 0) % % computes the hypervolume dominated by the rows of Y, with respect to the % reference point Y_REF (a row vector with the same number of columns as Y). % It is expected that all the rows of Y are smaller than Y_REF % (multi-objective minimization framework). % % CALL: HV = stk_dominatedhv (Y) % CALL: HV = stk_dominatedhv (Y, [], 0) % % uses [0 0 ... 0] as a reference point. % % CALL: DECOMP = stk_dominatedhv (Y, Y_REF, 1) % % computes a signed decomposition of the dominated hyper-region delimited by % the reference point Y_REF into overlapping rectangles. Assuming that Y is % of size N x D, the result DECOMP is a structure with field .sign (N x 1), % .xmin (N x D) and .xmax (N x D). The hypervolume can be recovered from this % decomposition using % % HV = sum (DECOMP.sign .* prod (DECOMP.xmax - DECOMP.xmin, 2)) % % provided that the resulting decomposition is not empty. % % CALL: HV = stk_dominatedhv (Y, [], 1) % % computed a signed decomposition using [0 0 ... 0] as a reference point. % % NOTE: % % This function relies internally on the WFG algorithm [1, 2]. % % REFERENCES: % % [1] Lyndon While, Lucas Bradstreet and Luigi Barone, "A Fast Way of % Calculating Exact Hypervolumes", IEEE Transactions on Evolutionary % Computation, 16(1):86-95, 2012 % http://dx.doi.org/10.1109/TEVC.2010.2077298 % % [2] WFG 1.10, released under the GPLv2 licence, available online from: % http://www.wfg.csse.uwa.edu.au/hypervolume/ % % See also: sortrows, stk_isdominated, stk_paretofind % Copyright Notice % % Copyright (C) 2015, 2017 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function result = stk_dominatedhv (y, y_ref, do_decomposition) if nargin > 3, stk_error ('Too many input arguments.', 'TooManyInputArgs'); end % Missing or empty y_ref: will use [0 0 ... 0] as a reference point if nargin < 2, y_ref = []; elseif ~ ((isnumeric (y_ref)) && ((isempty (y_ref)) || (isrow (y_ref)))) stk_error ('y_ref should be a numeric row vector.', 'IncorrectSize'); end % Return the decomposition or just the value of the volume ? if nargin < 3 do_decomposition = false; else do_decomposition = logical (do_decomposition); end % Pre-processing if iscell (y), y = cellfun (@(z) wfg_preprocessing (z, y_ref), y, 'UniformOutput', false); else % y is a matrix try y = double (y); assert (ndims (y) == 2); %#ok see CODING_GUDELINES catch stk_error (['y should either be a cell array or be (convertible ' ... 'to) a numeric matrix'], 'InvalidArgument'); end y = wfg_preprocessing (y, y_ref); end % COMPUTE if ~ do_decomposition, % Compute the hypervolume only result = __stk_dominatedhv_mex__ (y, false); else % Compute the decomposition into hyper-rectangles result = __stk_dominatedhv_mex__ (y, true); % Post-processing if iscell (y) result = arrayfun (@(hv) wfg_postprocessing (hv, y_ref), ... result, 'UniformOutput', true); else result = wfg_postprocessing (result, y_ref); end end end % function function y = wfg_preprocessing (y, y_ref) y = double (y); % Keep only non-dominated points, and remove duplicates y = unique (y(stk_paretofind (y), :), 'rows'); if isempty (y_ref) % Use [0 0 ... 0] as a reference point % WFG convention: maximization problem y = - y; else % Reference point provided p = size (y, 2); p_ref = size (y_ref, 2); % Check the size of y if (p > p_ref) stk_error (['The number of columns the data matrix should not be ' ... 'larger than the number of columns of y_ref'], 'InvalidArgument'); end % WFG convention: maximization problem y = bsxfun (@minus, y_ref(1:p), y); end % Remove points that do not dominate the reference b = any (y < 0, 2); y(b, :) = []; end % function function hv = wfg_postprocessing (hv, y_ref) p = size (hv.xmin, 2); xmin = hv.xmin; if isempty (y_ref) hv.xmin = - hv.xmax; hv.xmax = - xmin; else hv.xmin = bsxfun (@minus, y_ref(1:p), hv.xmax); hv.xmax = bsxfun (@minus, y_ref(1:p), xmin); end end % function %!error hv = stk_dominatedhv (); %!error hv = stk_dominatedhv (-y, 'incorrect ref type'); %!error hv = stk_dominatedhv (-y, [0 0]); %!error hv = stk_dominatedhv (-y, [0 0 0 0 0], 0, 'too many input args'); %------------------------------------------------------------------------------- %!shared y, hv0 % Example from README.TXT in WFG 1.10 %! %! y = [ ... %! 0.598 0.737 0.131 0.916 6.745; ... %! 0.263 0.740 0.449 0.753 6.964; ... %! 0.109 8.483 0.199 0.302 8.872 ]; %! %! hv0 = 1.1452351120; %!test %! hv = stk_dominatedhv (-y); %! assert (stk_isequal_tolrel (hv, hv0, 1e-10)); %!test %! yy = stk_dataframe (- y); % Check that @stk_dataframe inputs are accepted %! hv = stk_dominatedhv (yy); %! assert (stk_isequal_tolrel (hv, hv0, 1e-10)); %!test %! hv = stk_dominatedhv (-y, [], 0); %! assert (stk_isequal_tolrel (hv, hv0, 1e-10)); %!test %! hv = stk_dominatedhv (-y, [0 0 0 0 0]); %! assert (stk_isequal_tolrel (hv, hv0, 1e-10)); %!test %! hv = stk_dominatedhv (1 - y, [1 1 1 1 1]); %! assert (stk_isequal_tolrel (hv, hv0, 1e-10)); %!test %! r = stk_dominatedhv (-y, [], 1); %! hv = sum (r.sign .* prod (r.xmax - r.xmin, 2)); %! assert (stk_isequal_tolrel (hv, hv0, 1e-10)); %------------------------------------------------------------------------------- %!shared y1, y2, y0, S, S1 %! y0 = [1.00 1.00]; % Reference point %! y1 = [1.50 1.50]; % Above the reference point %! y2 = [0.50 0.50]; % Below the reference point %!assert (isequal (0.00, stk_dominatedhv (y1, y0))); %!assert (isequal (0.25, stk_dominatedhv (y2, y0))); %!assert (isequal (0.25, stk_dominatedhv ([y1; y2], y0))); %!assert (isequal (0.25, stk_dominatedhv ([y2; y1; y2], y0))); % Check decompositions: %!test S = stk_dominatedhv (y1, y0, 1); % empty decomposition %!assert (isequal (size (S.xmin, 1), 0)); %!test S = stk_dominatedhv (y2, y0, 1); % trivial decomposition %!assert (isequal (S.sign, 1)); %!assert (isequal (S.xmin, y2)); %!assert (isequal (S.xmax, y0)); %!test S1 = stk_dominatedhv ([y2; y0], y0, 1); % shoud be the same as before %!assert (isequal (S1, S)); %!test S1 = stk_dominatedhv ([y2; y1], y0, 1); % shoud be the same as before %!assert (isequal (S1, S)); %!test S1 = stk_dominatedhv ([y2; y2], y0, 1); % shoud be the same as before %!assert (isequal (S1, S)); %------------------------------------------------------------------------------- %!test %! for d = 1:10, %! y = - 0.5 * ones (1, d); %! hv = stk_dominatedhv (y); %! assert (isequal (stk_dominatedhv (y), 0.5 ^ d)); %! end %!test %! for d = 1:10, %! y = - 0.5 * ones (1, d); %! r = stk_dominatedhv (y, [], 1); %! hv = sum (r.sign .* prod (r.xmax - r.xmin, 2)); %! assert (isequal (stk_dominatedhv (y), 0.5 ^ d)); %! end %------------------------------------------------------------------------------- %!shared y, y_ref, dv, hv0 %! y1 = [0.25 0.75]; %! y2 = [0.50 0.50]; %! y3 = [0.75 0.25]; %! %! y_ref = [1 1]; %! %! y = {[], y1, y2, y3; [y1; y2], [y1; y3], [y2; y3], [y1; y2; y3]}; %! %! dv = 0.25 ^ 2; hv0 = [0 3 4 3; 5 5 5 6] * dv; %!test %! hv1 = stk_dominatedhv (y, y_ref); %! assert (isequal (hv0, hv1)); %!test %! r = stk_dominatedhv (y, y_ref, 1); %! %! % Check the first decomposition, which should be empty %! assert (isempty (r(1).sign)); %! assert (isempty (r(1).xmin)); %! assert (isempty (r(1).xmax)); %! %! % Check the other decompositions %! for i = 2:6, %! hv2 = sum (r(i).sign .* prod (r(i).xmax - r(i).xmin, 2)); %! assert (isequal (hv0(i), hv2)); %! end %------------------------------------------------------------------------------- %!test %! y = (0.3:0.1:0.8)'; %! hv0 = 0.7; %! hv1 = stk_dominatedhv (y, 1); %! r = stk_dominatedhv (y, 1, true); %! hv2 = sum (r.sign .* prod (r.xmax - r.xmin, 2)); %!test % four non-dominated points (hypervolume) %! zr = [1 1]; %! zi = [0.2 0.8; 0.4 0.6; 0.6 0.4; 0.8 0.2] %! P = perms (1:4); %! for i = 1:24 %! HV = stk_dominatedhv (zi(P(i, :), :), zr, 0); %! assert (stk_isequal_tolrel (HV, 0.4, 1e-15)); %! end %!test % four non-dominated points (decomposition) %! zr = [1 1]; %! zi = [0.2 0.8; 0.4 0.6; 0.6 0.4; 0.8 0.2] %! P = perms (1:4); %! for i = 1:24 %! S = stk_dominatedhv (zi(P(i, :), :), zr, 1); %! HV = sum (S.sign .* prod (S.xmax - S.xmin, 2)); %! assert (stk_isequal_tolrel (HV, 0.4, 1e-15)); %! end %!test % a case with 8 points and 5 objectives %! % http://sourceforge.net/p/kriging/tickets/33 %! %! yr = [1.03 0.91 0.96 1.99 16.2]; %! %! y = [ ... %! 0.8180 0.5600 0.1264 1.0755 1.2462; ... %! 0.8861 0.6928 0.2994 0.7228 0.9848; ... %! 0.9021 0.8829 0.6060 0.1642 0.4282; ... %! 0.9116 0.3097 0.8601 0.0468 0.2813; ... %! 0.9306 0.1429 0.6688 0.1462 1.3661; ... %! 0.9604 0.3406 0.4046 0.7239 1.8741; ... %! 0.9648 0.7764 0.5199 0.4098 1.3436; ... %! 0.9891 0.4518 0.7956 0.1164 1.2025]; %! %! hv1 = stk_dominatedhv (y, yr, 0); %! %! S = stk_dominatedhv (y, yr, 1); %! hv2 = sum (S.sign .* prod (S.xmax - S.xmin, 2)); %! %! assert (isequal (size (S.sign), [87 1])); %! assert (isequal (size (S.xmin), [87 5])); %! assert (isequal (size (S.xmax), [87 5])); %! assert (stk_isequal_tolrel (hv1, 1.538677420906463, 2 * eps)); %! assert (stk_isequal_tolrel (hv1, hv2, eps)); %!test % with random data %! NREP = 5; %! for p = 1:5 %! for n = 1:10 %! for i = 1:NREP %! % Draw random data %! y = rand (n, p); %! y = - y ./ (norm (y)); %! % Compute hypervolume directly %! hv1 = stk_dominatedhv (y, [], 0); %! % Compute decomposition, then hypervolume %! R = stk_dominatedhv (y, [], 1); %! hv2 = sum (R.sign .* prod (R.xmax - R.xmin, 2)); %! % Compare results %! assert (stk_isequal_tolabs (hv1, hv2, eps)); %! end %! end %! end stk/inst/misc/pareto/stk_isdominated.m0000644000000000000000000000612213156161544015315 0ustar % STK_ISDOMINATED returns true for dominated rows % % CALL: ISDOM = stk_isdominated (A, B) % % returns a vector ISDOM of logicals, where ISDOM(i) is true if A(i, :) % is dominated by one of the rows of B. A row B(j, :) is said to % dominate A(i, :) if % % B(j, k) <= A(i, k) for all k in {1, 2, ..., d} % % and % % B(j, k) < A(i, k) for at least one such k, % % where d is the number of columns. In other words: smaller is better. % % CALL: ISDOM = stk_isdominated (A, B, DO_SORTROWS) % % does the same but, if DO_SORTROWS == false, assumes that the rows of % B are already sorted in ascending lexical order. % % CALL: [ISDOM, DPOS] = stk_isdominated (A, B, DO_SORTROWS) % % also returns a vector DPOS such that DPOS(i) = 0 if A(i, :) is non- % dominated, and DPOS(i) gives the index of a row in B that dominates % A(i, :) otherwise. % % See also: sortrows, stk_paretofind, stk_dominatedhv % Copyright Notice % % Copyright (C) 2015 CentraleSupelec % Copyright (C) 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function [isdom, dpos, Bsnd] = stk_isdominated (A, B, do_sortrows) A = double (A); B = double (B); if nargin < 3, do_sortrows = true; end if do_sortrows, ndpos = stk_paretofind (B); Bsnd = B(ndpos, :); end if nargout < 2 isdom = __stk_isdominated_mex__ (A, Bsnd); else [isdom, drank] = __stk_isdominated_mex__ (A, Bsnd); if do_sortrows, dpos = zeros (size (drank)); dpos(isdom) = ndpos(drank(isdom)); end end end % function %!test %! A = [1 3 2]; %! B = [0 0 0]; %! [isdom, dpos] = stk_isdominated (A, B); %! assert (isdom == 1); %! assert (dpos == 1); %!test %! A = [1 3 2]; %! B = [0 0 3]; %! [isdom, dpos] = stk_isdominated (A, B); %! assert (isdom == 0); %! assert (dpos == 0); %!test %! A = [1 3 2]; %! B = [0 0 0; 0 0 3]; %! [isdom, dpos] = stk_isdominated (A, B); %! assert (isdom == 1); %! assert (dpos == 1); %!test %! A = [1 3 2]; %! B = [0 0 3; 0 0 0]; %! [isdom, dpos] = stk_isdominated (A, B); %! assert (isdom == 1); %! assert (dpos == 2); %!test %! A = [1 3 2; 1 0 1; -1 0 0; 1 3 2]; %! B = [1 0 0; 0 0 3; 0 0 0]; %! [isdom, dpos] = stk_isdominated (A, B); %! assert (isequal (isdom, logical ([1; 1; 0; 1]))); %! assert (isequal (dpos, [3; 3; 0; 3])); stk/inst/misc/pareto/stk_paretofind.m0000644000000000000000000000542713156161544015157 0ustar % STK_PARETOFIND finds non-dominated rows in an array % % CALL: [NDPOS, DRANK] = stk_paretofind (X) % % returns the indices NDPOS such that X(NDPOS, :) contains all non- % dominated rows of X, sorted in (ascending) lexical order. A row % X(i, :) is said to dominate another row X(j, :) if % % X(i, k) <= X(j, k) for all k in {1, 2, ..., d} % % and % % X(i, k) < X(j, k) for at least one such k, % % where d is the number of columns. In other words: smaller is better. % For each row X(i, :), DRANK(i) is equal to zero if the row is non- % dominated, and equal to the smallest j such that X(i, :) is dominated % by X(NDPOS(j), :) otherwise. % % See also: sortrows, stk_isdominated, stk_dominatedhv % Copyright Notice % % Copyright (C) 2015 CentraleSupelec % Copyright (C) 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function varargout = stk_paretofind (x) varargout = cell (1, max (1, nargout)); [varargout{:}] = __stk_paretofind_mex__ (double (x)); end % function %!shared x, ndpos, drank %! x = [ ... %! 0 2; ... %! 2 2; ... %! ]; %!test [ndpos, drank] = stk_paretofind (x); %!assert (isequal (ndpos, 1)); %!assert (isequal (drank, [0; 1])); %!shared x, ndpos, drank %! x = [ ... %! 3 2; ... %! 2 2; ... %! ]; %!test [ndpos, drank] = stk_paretofind (x); %!assert (isequal (ndpos, 2)); %!assert (isequal (drank, [1; 0])); %!shared x, ndpos, drank %! x = [ ... %! 1 0; ... %! 2 0; ... %! 0 2; ... %! 2 2; ... %! -1 3 ]; %!test [ndpos, drank] = stk_paretofind (x); %!assert (isequal (ndpos, [5; 3; 1])); %!assert (isequal (drank, [0; 3; 0; 2; 0])); %!shared x, ndpos, drank %! x = [ ... %! 1 0; ... %! 2 0; ... %! 0 2; ... %! 2 2; ... %! -1 3; ... %! -1 4; ... %! 2 2 ]; %!test [ndpos, drank] = stk_paretofind (x); %!assert (isequal (ndpos, [5; 3; 1])); %!assert (isequal (drank, [0; 3; 0; 2; 0; 1; 2])); stk/inst/misc/plot/0000755000000000000000000000000013156161544011441 5ustar stk/inst/misc/plot/stk_axes.m0000644000000000000000000000250213156161544013437 0ustar % STK_AXES [STK internal] % % STK_AXES is a replacement for 'axes' for use in STK's examples. % Copyright Notice % % Copyright (C) 2016 CentraleSupelec % Copyright (C) 2013, 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function h = stk_axes (varargin) % Get global STK options options = stk_options_get ('stk_axes', 'properties'); % Create figure h = axes (options{:}); % Apply user-provided options if ~ isempty (varargin) set (h, varargin{:}); end end % function stk/inst/misc/plot/stk_figure.m0000644000000000000000000000316013156161544013761 0ustar % STK_FIGURE [STK internal] % % STK_FIGURE is a replacement for 'figure' for use in STK's examples. % Copyright Notice % % Copyright (C) 2016 CentraleSupelec % Copyright (C) 2013, 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function h_fig = stk_figure (varargin) if mod (length (varargin), 2) ~= 0 figname = varargin{1}; user_options = varargin(2:end); else figname = ''; user_options = varargin; end % Get global STK options options = stk_options_get ('stk_figure', 'properties'); % Create figure h_fig = figure (options{:}); % Create axes stk_axes; % Apply user-provided options if ~ isempty (user_options) set (h_fig, user_options{:}); end % Set figure name and title if ~ isempty (figname) set (h_fig, 'Name', figname); end end % function stk/inst/misc/plot/stk_labels.m0000644000000000000000000000300313156161544013736 0ustar % STK_LABELS [STK internal] % % STK_LABELS is a shortcut for stk_xlabel + stk_ylabel. % Copyright Notice % % Copyright (C) 2016 CentraleSupelec % Copyright (C) 2013, 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function h_labels = stk_labels (varargin) % Extract axis handle (if it is present) [h_axes, varargin, n_argin] = stk_plot_getaxesarg (varargin{:}); if n_argin < 2, stk_error ('Not enough input arguments.', 'NotEnoughInputArgs'); end xlab = varargin{1}; ylab = varargin{2}; options = varargin(3:end); h_labels = zeros (2, 1); h_labels(1) = stk_xlabel (h_axes, xlab, options{:}); h_labels(2) = stk_ylabel (h_axes, ylab, options{:}); end % function stk/inst/misc/plot/stk_plot_getaxesarg.m0000644000000000000000000000325213156161544015672 0ustar % STK_PLOT_GETAXISARG [STK internal] % Copyright Notice % % Copyright (C) 2016 CentraleSupelec % Copyright (C) 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function [h_axes, argin, n_argin] = stk_plot_getaxesarg (varargin) if isempty (varargin) h_axes = []; argin = {}; n_argin = 0; else % Check if the first argument is a handle to existing axes arg1_is_a_handle = false; try %#ok arg1_is_a_handle = (isscalar (varargin{1})) ... && (strcmp (get (varargin{1}, 'type'), 'axes')); end % Separate axis handle from the rest of the arguments if arg1_is_a_handle h_axes = varargin{1}; argin = varargin(2:end); else h_axes = gca (); argin = varargin; end n_argin = length (argin); end end % function stk/inst/misc/plot/stk_plot_shadedci.m0000644000000000000000000000623313156161544015306 0ustar % STK_PLOT_SHADEDCI [STK internal] % % STK_PLOT_SHADEDCI represents pointwise confidence itervals using a shaded % area. % Copyright Notice % % Copyright (C) 2015-2017 CentraleSupelec % Copyright (C) 2012, 2013 SUPELEC % % Authors: Julien Bect % Emmanuel Vazquez % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function h_plot = stk_plot_shadedci (varargin) [h_axes, x, z, opts] = parse_args_ (varargin{:}); x = double (x); % Avoid a dependency on the stat toolbox in Matlab: % norminv (1 - 0.05/2) = 1.9600 % norminv (1 - 0.01/2) = 2.5758 % norminv (1 - 0.001/2) = 3.2905 delta0 = [3.2905 2.5758 1.9600]; gray_level = [0.95 0.88 0.80]; % Use fill or area ? persistent use_fill if isempty (use_fill) v = regexp (version (), '^[0-9]*\.', 'match'); if exist ('OCTAVE_VERSION', 'builtin') % In Octave 3.x, prefer area. There are several problems with fill use_fill = (str2double (v{1}) >= 4); else % Problem: fill does not support the h_axes argument in Matlab < R2016a use_fill = (str2double (v{1}) >= 9); % 9.0 is R2016a end end for k = 1:3 delta = delta0(k) * sqrt (abs (z.var)); patch_color = gray_level(k) * [1 1 1]; if use_fill xx = [x; flipud(x)]; zz = [z.mean - delta; flipud(z.mean + delta)]; h_plot = fill (h_axes, xx, zz, patch_color, 'EdgeColor', patch_color); else h_plot = area (h_axes, x, [z.mean - delta, 2 * delta]); % Remove the first area object (between 0 and z.mean - delta) delete (h_plot(1)); h_plot = h_plot(2); set (h_plot, 'FaceColor', patch_color, 'LineStyle', '-', ... 'LineWidth', 1, 'EdgeColor', patch_color); end hold on; % The options in 'opts', if any, are applied to all patch objects if ~ isempty (opts) set (h_plot, opts{:}); end end hold off; % Raise current axis to the top layer, to prevent it % from being hidden by the grayed area set (gca, 'Layer', 'top'); end % function function [h_axes, x, z, opts] = parse_args_ (varargin) % Extract axis handle (if it is present) [h_axes, varargin, n_argin] = stk_plot_getaxesarg (varargin{:}); if n_argin < 2 stk_error ('Not enough input arguments.', 'NotEnoughInputArgs'); end x = varargin{1}; z = varargin{2}; opts = varargin(3:end); end % function stk/inst/misc/plot/stk_subplot.m0000644000000000000000000000270213156161544014171 0ustar % STK_SUBPLOT [STK internal] % % STK_SUBPLOT is a replacement for 'subplot' for use in STK's examples. % Copyright Notice % % Copyright (C) 2016 CentraleSupelec % Copyright (C) 2013, 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function h_axes = stk_subplot (m, n, p, varargin) % Get global STK options stk_options = stk_options_get ('stk_axes', 'properties'); % Create axes h_axes = subplot (m, n, p); % Apply STK options first if ~ isempty (stk_options) set (h_axes, stk_options{:}); end % Apply user-provided options if ~ isempty (varargin) set (h_axes, varargin{:}); end end % function stk/inst/misc/plot/stk_title.m0000644000000000000000000000305613156161544013625 0ustar % STK_TITLE [STK internal] % % STK_TITLE is a replacement for 'title' for use in STK's examples. % Copyright Notice % % Copyright (C) 2016 CentraleSupelec % Copyright (C) 2013, 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function h = stk_title (varargin) if ischar (varargin{1}) args = varargin(1); % title user_options = varargin(2:end); else args = varargin(1:2); % axes handle + title user_options = varargin(3:end); end % Get global STK options stk_options = stk_options_get ('stk_title', 'properties'); % Display title with STK options h = title (args{:}, stk_options{:}); % Apply user-provided options if ~ isempty (user_options) set (h, user_options{:}); end end % function stk/inst/misc/plot/stk_xlabel.m0000644000000000000000000000277713156161544013764 0ustar % STK_XLABEL [STK internal] % % STK_XLABEL is a replacement for 'xlabel' for use in STK's examples. % Copyright Notice % % Copyright (C) 2016 CentraleSupelec % Copyright (C) 2013, 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function h_label = stk_xlabel (varargin) [h_axes, varargin] = stk_plot_getaxesarg (varargin{:}); xlab = varargin{1}; % Get global STK options stk_options = stk_options_get ('stk_xlabel', 'properties'); user_options = varargin(2:end); % Set x-label and apply STK options h_label = xlabel (h_axes, xlab, stk_options{:}); % Apply user-provided options if ~ isempty (user_options) set (h_label, user_options{:}); end end % function stk/inst/misc/plot/stk_ylabel.m0000644000000000000000000000300513156161544013746 0ustar % STK_YLABEL [STK internal] % % STK_YLABEL is a replacement for 'ylabel' for use in STK's examples. % Copyright Notice % % Copyright (C) 2016 CentraleSupelec % Copyright (C) 2013, 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function h_label = stk_ylabel (varargin) [h_axes, varargin] = stk_plot_getaxesarg (varargin{:}); ylab = varargin{1}; % Get global STK options stk_options = stk_options_get ('stk_ylabel', 'properties'); user_options = varargin(2:end); % Set y-label and apply STK options h_label = ylabel (h_axes, ylab, stk_options{:}); % Apply user-provided options if ~ isempty (user_options) set (h_label, user_options{:}); end end % function stk/inst/misc/plot/stk_zlabel.m0000644000000000000000000000277113156161544013760 0ustar % STK_ZLABEL [STK internal] % % STK_ZLABEL is a replacement for 'zlabel' for use in STK's examples. % Copyright Notice % % Copyright (C) 2016 CentraleSupelec % Copyright (C) 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function h_label = stk_zlabel (varargin) [h_axes, varargin] = stk_plot_getaxesarg (varargin{:}); zlab = varargin{1}; % Get global STK options stk_options = stk_options_get ('stk_zlabel', 'properties'); user_options = varargin(2:end); % Set z-label and apply STK options h_label = zlabel (h_axes, zlab, stk_options{:}); % Apply user-provided options if ~ isempty (user_options) set (h_label, user_options{:}); end end % function stk/inst/misc/test/0000755000000000000000000000000013156161544011442 5ustar stk/inst/misc/test/stk_is_lhs.m0000644000000000000000000000502513156161544013764 0ustar % STK_IS_LHS tests if a given set of points forms a LHS % % CALL: OK = stk_is_lhs (X, N, DIM, BOX) % % tests if X is a Latin Hypercube Sample (LHS) of size N, over the hyper- % rectangle BOX of dimension DIM. The result OK is true if X is a LHS and % false otherwise. % % CALL: OK = stk_is_lhs (X, N, DIM) % % tests if X is a Latin Hypercube Sample (LHS) of size N, over the hyper- % rectangle [0; 1]^DIM. % % CALL: OK = stk_is_lhs (X) % % tests if X is a Latin Hypercube Sample (LHS). Both the size N and the % number DIM of factors are inferred from X. % % All three calling syntaxes accept both matrix-type inputs or data structures % (with an 'a' field) for X. % Copyright Notice % % Copyright (C) 2012-2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function b = stk_is_lhs (x, n, dim, box) if nargin > 4, stk_error ('Too many input arguments.', 'TooManyInputArgs'); end x = double (x); if nargin == 1, [n dim] = size (x); elseif nargin == 2, if size (x, 1) ~= n, b = false; return; end dim = size (x, 2); else % nargin > 2 if ~ isequal (size (x), [n dim]) b = false; return; end end % read argument 'box' if (nargin < 4) || (isempty (box)) xmin = zeros (1, dim); xmax = ones (1, dim); else if ~ isa (box, 'stk_hrect') box = stk_hrect (box); end xmin = box.lower_bounds; xmax = box.upper_bounds; end for j = 1:dim, y = x(:,j); if (xmin(j) > min(y)) || (xmax(j) < max(y)) b = false; return; end y = (y - xmin(j)) / (xmax(j) - xmin(j)); y = ceil (y * n); if ~ isequal (sort (y), (1:n)'), b = false; return; end end b = true; end % function stk/inst/misc/test/stk_isequal_tolabs.m0000644000000000000000000000671713156161544015523 0ustar % STK_ISEQUAL_TOLABS tests approximate equality of two matrices or structures. % % CALL: BOOL = stk_isequal_tolabs(A, B, TOLABS) % % returns true if A and B are numeric arrays of the same size, such that for % any pair (a, b) of corresponding entries, % % abs(b - a) <= TOLABS. (1) % % For numeric array, the function returns false is either % % * the array don't have identical sizes, or % * the array have identical sizes but (1) doesn't hold. % % If A and B are structures with the same list of fieldnames, the function % works recursively on the fields, and returns true iff all the fields are % approximately equal. % % CALL: b = stk_isequal_tolabs(a, b) % % uses the default value 1e-8 for TOLABS. % % See also isequal. % Copyright Notice % % Copyright (C) 2012, 2013 SUPELEC % % Authors: Julien Bect % Emmanuel Vazquez % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function res = stk_isequal_tolabs(a, b, tolabs) DEFAULT_TOLABS = 1e-8; if nargin > 3, stk_error ('Too many input arguments.', 'TooManyInputArgs'); end if nargin == 2, tolabs = DEFAULT_TOLABS; end if isstruct(a) && isstruct(b), L = fieldnames(a); if ~isequal(fieldnames(b), L), res = false; return; end res = true; for k = 1:length(L), if ~isfield(b, L{k}), res = false; return; end res = stk_isequal_tolabs(a.(L{k}), b.(L{k}), tolabs); if ~ res, return; end end elseif isnumeric(a) && isnumeric(b) res = all(abs(b(:) - a(:)) <= tolabs); elseif ischar (a) && ischar (b) res = strcmp (a, b); elseif iscell (a) && iscell (b) for i = 1:numel(a), if ~stk_isequal_tolabs (a{i}, b{i}, tolabs); res = false; return; end end res = true; elseif (isa (a, 'stk_dataframe') || isa (a, 'stk_kreq_qr')) ... && (strcmp (class (a), class (b))) res = stk_isequal_tolabs (struct (a), struct (b), tolabs); else res = false; end end % function %!shared r1, r2, a, b, tolabs %! a = 1.01; b = 1.02; tolabs = 0.1; %!error rr = stk_isequal_tolabs(); %!error rr = stk_isequal_tolabs(a); %!test r1 = stk_isequal_tolabs(a, b); %!test r2 = stk_isequal_tolabs(a, b, tolabs); %!error rr = stk_isequal_tolabs(a, b, tolabs, pi); %!test assert(~r1); %!test assert(r2); %!test %! a = struct('u', []); b = struct('v', []); %! assert(~ stk_isequal_tolabs(a, b)) %!test %! a = struct('u', 1.01); b = struct('u', 1.02); %! assert(stk_isequal_tolabs(a, b, tolabs)) stk/inst/misc/test/stk_isequal_tolrel.m0000644000000000000000000000736313156161544015536 0ustar % STK_ISEQUAL_TOLREL tests approximate equality of two matrices or structures. % % CALL: BOOL = stk_isequal_tolrel(A, B, TOLREL) % % returns true if A and B are numeric arrays of the same size, such that for % any pair (a, b) of corresponding entries, % % abs(b - a) <= TOLABS, (1) % % where % % TOLABS = max(max(A(:)), max(B(:))) * TOLREL. % % For numeric array, the function returns false is either % % * the array don't have identical sizes, or % * the array have identical sizes but (1) doesn't hold. % % If A and B are structures with the same list of fieldnames, the function % works recursively on the fields, and returns true iff all the fields are % approximately equal. % % CALL: b = stk_isequal_tolrel(a, b) % % uses the default value 1e-8 for TOLREL. % % See also isequal. % Copyright Notice % % Copyright (C) 2012, 2013 SUPELEC % % Authors: Julien Bect % Emmanuel Vazquez % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function res = stk_isequal_tolrel(a, b, tolrel) DEFAULT_TOLREL = 1e-8; if nargin > 3, stk_error ('Too many input arguments.', 'TooManyInputArgs'); end if nargin == 2, tolrel = DEFAULT_TOLREL; end if isstruct(a) && isstruct(b), L = fieldnames(a); if ~isequal(fieldnames(b), L), res = false; return; end res = true; for k = 1:length(L), if ~isfield(b, L{k}), res = false; return; end res = stk_isequal_tolrel(a.(L{k}), b.(L{k}), tolrel); if ~ res, return; end end elseif isnumeric(a) && isnumeric(b) if ~ isequal (size (a), size (b)) res = false; else aa = a(:); bb = b(:); tolabs = max(abs(aa), abs(bb)) * tolrel; res = all(abs(bb - aa) <= tolabs); end elseif ischar (a) && ischar (b) res = strcmp (a, b); elseif iscell (a) && iscell (b) for i = 1:numel(a), if ~ stk_isequal_tolrel (a{i}, b{i}, tolrel); res = false; return; end end res = true; elseif isa (a, 'stk_dataframe') && (strcmp (class (a), class (b))) res = stk_isequal_tolrel (struct (a), struct (b), tolrel); else res = false; end end % function %!shared r1, r2, r3, a, b, tolrel %! a = 1.01; b = 1.02; tolrel = 0.1; %!error rr = stk_isequal_tolrel(); %!error rr = stk_isequal_tolrel(a); %!test r1 = stk_isequal_tolrel(a, b); %!test r2 = stk_isequal_tolrel(a, b, tolrel); %!test r3 = stk_isequal_tolrel(a, [b b]); %!error rr = stk_isequal_tolrel(a, b, tolrel, pi); %!test assert (isequal (r1, false)); %!test assert (isequal (r2, true)); %!test assert (isequal (r3, false)); %!test %! a = struct('u', []); b = struct('v', []); %! assert(~ stk_isequal_tolrel(a, b)) %!test %! a = struct('u', 1.01); b = struct('u', 1.02); %! assert(stk_isequal_tolrel(a, b, tolrel)) stk/inst/misc/test/stk_runtests.m0000644000000000000000000001743213156161544014377 0ustar % STK_RUNTESTS runs all tests in a given directory (or in STK's searchpath). % % FIXME: missing doc % Copyright Notice % % Copyright (C) 2015, 2017 CentraleSupelec % Copyright (C) 2012-2014 SUPELEC % % Author: Julien Bect % % This file has been adapted from runtests.m in Octave 3.6.2 (which is % distributed under the GNU General Public Licence version 3 (GPLv3)). % The original copyright notice was as follows: % % Copyright (C) 2010-2012 John W. Eaton % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . %% Original Octave doc, to be adapted % -*- texinfo -*- % @deftypefn {Function File} {} runtests () % @deftypefnx {Function File} {} runtests (@var{directory}) % Execute built-in tests for all function files in the specified directory. % If no directory is specified, operate on all directories in Octave's % search path for functions. % @seealso{rundemos, path} % @end deftypefn function stk_runtests (varargin) if (exist ('OCTAVE_VERSION', 'builtin') == 5) ... && (exist ('__run_test_suite__', 'file') == 2) % Use the original __run_test_suite__ function, shipped with Octave if nargin == 0 % Scan all STK directories if no input argument is provided directory = fileparts (fileparts (fileparts (mfilename ('fullpath')))); else directory = varargin{1}; end % NOTE: feval prevents Matlab from complaining about the underscores feval ('__run_test_suite__', {directory}, {}); else % Matlab % Use the replacement that is provided with STK stk_runtests_ (varargin{:}); end % if end % function function stk_runtests_ (directory) if nargin == 0 % scan all STK directories if no input argument is provided dirs = stk_init ('genpath'); else % otherwise, directory is expected to be a valid directory name if ~ exist (directory, 'dir') error ('Directory not found.'); end here = pwd (); cd (directory); dirs = {pwd()}; % get absolute path cd (here); end % number of directories to be explored nb_topdirs = numel(dirs); % run tests all available tests in each directory n_total = 0; n_pass = 0; n_files = 0; n_notest = 0; n_dirs = 0; err = {}; for i = 1:nb_topdirs [np, nt, nn, nf, nd, err] = run_all_tests (dirs{i}, dirs{i}, err); n_total = n_total + nt; n_pass = n_pass + np; n_files = n_files + nf; n_notest = n_notest + nn; n_dirs = n_dirs + nd; end if n_dirs > 1, fprintf ('*** Summary for all %d directories:\n', n_dirs); fprintf ('*** --> passed %d/%d tests\n', n_pass, n_total); fprintf ('*** --> %d/%d files had no tests\n\n', n_notest, n_files); end if ~ isempty (err) fprintf ('!!! Summary of failed tests:\n'); for i = 1:(size (err, 1)) fprintf ('!!! %s [%d/%d]\n', err{i,1}, err{i,2} - err{i,3}, err{i,2}); end end end % function %%%%%%%%%%%%%%%%% % run_all_tests % %%%%%%%%%%%%%%%%% function [n_pass, n_total, n_notest, n_files, n_dirs, err] ... = run_all_tests (testdir, basedir, err) % list directory content dirinfo = dir(testdir); flist = {dirinfo.name}; here = pwd (); cd (basedir); fprintf ('Processing files in %s:\n\n', testdir); fflush (stdout); % init counters n_total = 0; n_pass = 0; n_files = 0; n_notest = 0; n_dirs = 1; % list of subdirectories to be processed subdirs_class = {}; subdirs_private = {}; for i = 1:numel (flist) f = flist{i}; ff = fullfile(testdir, f); if (length (f) > 2) && strcmp (f((end-1):end), '.m') n_files = n_files + 1; print_test_file_name (f); if has_tests (ff) % Silence all warnings & prepare for warning detection. s = warning_off (); try % Do the actual tests. [p, n] = stk_test (ff, 'quiet', stdout); % Note: the presence of the third argument (fid=stdout) forces % stk_test in batch mode, which means that it doesn't stop at % the first failed test. print_pass_fail (n, p); n_total = n_total + n; n_pass = n_pass + p; % Record function name if at least one test failed if p < n, err = [err; {ff, n, p}]; end % deal with warnings if ~ isempty (lastwarn ()), fprintf (' (warnings)'); end warning (s); catch % Restore warning state after error warning (s); rethrow (lasterror ()); end else n_notest = n_notest + 1; fprintf (' NO TESTS'); end fprintf ('\n'); fflush (stdout); elseif dirinfo(i).isdir && (f(1) == '@') subdirs_class{end+1} = ff; elseif dirinfo(i).isdir && strcmp(f, 'private') subdirs_private{end+1} = ff; end end fprintf (' --> passed %d/%d tests\n', n_pass, n_total); fprintf (' --> %d/%d files had no tests\n', n_notest, n_files); fprintf ('\n'); for i = 1:(length (subdirs_class)) [p, n, nnt, nf, nd, err] = run_all_tests ... (subdirs_class{i}, pwd(), err); n_total = n_total + n; n_pass = n_pass + p; n_files = n_files + nf; n_notest = n_notest + nnt; n_dirs = n_dirs + nd; end for i = 1:(length (subdirs_private)) [p, n, nnt, nf, nd, err] = run_all_tests ... (subdirs_private{i}, subdirs_private{i}, err); n_total = n_total + n; n_pass = n_pass + p; n_files = n_files + nf; n_notest = n_notest + nnt; n_dirs = n_dirs + nd; end cd (here); end % function %%%%%%%%%%%%% % has_tests % %%%%%%%%%%%%% function retval = has_tests (f) fid = fopen (f); if (fid >= 0) str = fread (fid, '*char')'; fclose (fid); retval = ~ isempty (regexp ... (str, '^%!(test|assert|error|warning)', 'lineanchors')); else error ('runtests: fopen failed: %s', f); end end % function %%%%%%%%%%%%%%%%%%% % print_pass_fail % %%%%%%%%%%%%%%%%%%% function print_pass_fail (n, p) if (n > 0) fprintf (' PASS %2d/%-2d', p, n); nfail = n - p; if (nfail > 0) fprintf (' FAIL %d', nfail); end end end % function %%%%%%%%%%%%%%%%%%%%%%%% % print_test_file_name % %%%%%%%%%%%%%%%%%%%%%%%% function print_test_file_name (nm) filler = repmat ('.', 1, 50 - length(nm)); fprintf (' %s %s', nm, filler); end % function %%%%%%%%%%%%%%% % warning_off % %%%%%%%%%%%%%%% function s = warning_off () s = warning ('off', 'all'); % Check whether warnings can be still be recovered by lastwarn % (this is not the case in Octave 3.8.2, for example; % see https://savannah.gnu.org/bugs/?41028) lastwarn (''); warning ('ah:ah', 'toto'); [msg, id] = lastwarn (); if ~ (strcmp (id, 'ah:ah') && strcmp (msg, 'toto')) warning ('on', 'all'); for i = 1:(length (s)) if ~ isempty (regexp (s(i).identifier, '^Octave:', 'once')) warning (s(i).state, s(i).identifier); end end end lastwarn (''); end % function %#ok<*AGROW> stk/inst/misc/test/stk_test.m0000644000000000000000000005361613156161544013473 0ustar % STK_TEST performs tests for a given M-file. % % FIXME: missing doc % Copyright Notice % % Copyright (C) 2017 CentraleSupelec % Copyright (C) 2012, 2013 SUPELEC % % Authors: Julien Bect % Emmanuel Vazquez % % This file has been adapted from test.m in Octave 3.6.2, distributed % under the GNU General Public Licence version 3 (GPLv3). The original % copyright notice was as follows: % % Copyright (C) 2005-2012 Paul Kienzle % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . %% % Octave doc, to be adapted... % % -*- texinfo -*- % @deftypefn {Command} {} test @var{name} % @deftypefnx {Command} {} test @var{name} quiet|normal|verbose % @deftypefnx {Function File} {} test ('@var{name}', 'quiet|normal|verbose', @var{fid}) % @deftypefnx {Function File} {} test ([], 'explain', @var{fid}) % @deftypefnx {Function File} {@var{success} =} test (@dots{}) % @deftypefnx {Function File} {[@var{n}, @var{max}] =} test (@dots{}) % @deftypefnx {Function File} {[@var{code}, @var{idx}] =} test ('@var{name}', 'grabdemo') % % Perform tests from the first file in the loadpath matching @var{name}. % @code{test} can be called as a command or as a function. Called with % a single argument @var{name}, the tests are run interactively and stop % after the first error is encountered. % % With a second argument the tests which are performed and the amount of % output is selected. % % @table @asis % @item 'quiet' % Don't report all the tests as they happen, just the errors. % % @item 'normal' % Report all tests as they happen, but don't do tests which require % user interaction. % % @item 'verbose' % Do tests which require user interaction. % @end table % % The argument @var{fid} can be used to allow batch processing. Errors % can be written to the already open file defined by @var{fid}, and % hopefully when Octave crashes this file will tell you what was happening % when it did. You can use @code{stdout} if you want to see the results as % they happen. You can also give a file name rather than an @var{fid}, in % which case the contents of the file will be replaced with the log from % the current test. % % Called with a single output argument @var{success}, @code{test} returns % true if all of the tests were successful. Called with two output arguments % @var{n} and @var{max}, the number of successful tests and the total number % of tests in the file @var{name} are returned. % % If the second argument is 'explain', then @var{name} is ignored and an % explanation of the line markers used is written to the file @var{fid}. % @seealso{assert, error, example} % @end deftypefn function varargout = stk_test (varargin) varargout = cell (1, nargout); if exist ('OCTAVE_VERSION', 'builtin') == 5 % Use the original test function shipped with Octave [varargout{:}] = test (varargin{:}); else % Matlab % Use the one that is provided with STK [varargout{:}] = stk_test_ (varargin{:}); end % if end % function function [x__ret1, x__ret2, x__ret3] = stk_test_ (x__name, x__flag, x__fid) SIGNAL_FAIL = '!!!!! '; % prefix: test had an unexpected result SIGNAL_EMPTY = '????? '; % prefix: no tests in file SIGNAL_BLOCK = '***** '; % prefix: code for the test SIGNAL_FILE = '>>>>> '; % prefix: new test file nb_expected_failures = 0; % counter for expected failures ('xtest' blocks) % default value for input arg #2: 'quiet' if nargin < 2 || isempty(x__flag), x__flag = 'quiet'; end % default value for input arg #3: [] (interactive mode, output --> stdout) if nargin < 3, x__fid = []; end if (nargin < 1) || (nargin > 3), error('Incorrect number of input arguments.'); end % first argument must be a non-empty string if isempty(x__name) || ~ischar(x__name), error('The first argument of stk_test() must be a non-empty string'); end % second argument must be a non-empty string if ~isempty(x__flag) && ~ischar(x__flag), error('The first argument of stk_test() must be either empty or a string'); end x__batch = (~ isempty (x__fid)); % Decide if error messages should be collected. x__close_fid = 0; if (x__batch) if (ischar (x__fid)) x__fid = fopen (x__fid, 'wt'); if (x__fid < 0) error ('test: could not open log file'); end x__close_fid = 1; end %fprintf (x__fid, '%sprocessing %s\n', SIGNAL_FILE, x__name); %fflush (x__fid); else x__fid = stdout; end switch x__flag, case 'normal', x__verbose = x__batch; case 'quiet', x__verbose = 0; case 'verbose', x__verbose = 1; otherwise, error('test: unknown flag ''%s''', x__flag); end % Locate the file to test. x__file = file_in_loadpath (x__name, 'all'); if (isempty (x__file)) x__file = file_in_loadpath ([x__name, '.m'], 'all'); end if (isempty (x__file)) x__file = file_in_loadpath ([x__name, '.cc'], 'all'); end if (iscell (x__file)) % If repeats, return first in path. if (isempty (x__file)) x__file = ''; else x__file = x__file{1}; end end if (isempty (x__file)) if (exist (x__name) == 3) fprintf (x__fid, '%s%s source code with tests for dynamically linked function not found\n', SIGNAL_EMPTY, x__name); else fprintf (x__fid, '%s%s does not exist in path\n', SIGNAL_EMPTY, x__name); end fflush (x__fid); if (nargout > 0) x__ret1 = 0; x__ret2 = 0; end if (x__close_fid) fclose(x__fid); end return; end % Grab the test code from the file. x__body = x__extract_test_code (x__file); if (isempty (x__body)) fprintf (x__fid, '%s%s has no tests available\n', SIGNAL_EMPTY, x__file); fflush (x__fid); if (nargout > 0) x__ret1 = 0; x__ret2 = 0; end if (x__close_fid) fclose(x__fid); end return; else % Add a dummy comment block to the end for ease of indexing. if (x__body (length(x__body)) == sprintf('\n')) x__body = sprintf ('\n%s%%', x__body); else x__body = sprintf ('\n%s\n%%', x__body); end end % Chop it up into blocks for evaluation. x__lineidx = find (x__body == sprintf('\n')); x__blockidx = x__lineidx(find (~ isspace (x__body(x__lineidx+1))))+1; % Ready to start tests ... if in batch mode, tell us what is happening. if (x__verbose) disp ([SIGNAL_FILE, x__file]); end % Assume all tests will pass. x__all_success = 1; % Process each block separately, initially with no shared variables. x__tests = 0; x__successes = 0; x__shared_names = {}; x__shared_vals = {}; for x__i = 1:length(x__blockidx)-1 % Extract the block. x__block = x__body(x__blockidx(x__i):x__blockidx(x__i+1)-2); % Let the user/logfile know what is happening. if (x__verbose) fprintf (x__fid, '%s%s\n', SIGNAL_BLOCK, x__block); fflush (x__fid); end % Split x__block into x__type and x__code. x__idx = find (~ isletter (x__block)); if (isempty (x__idx)) x__type = x__block; x__code = ''; else x__type = x__block(1:x__idx(1)-1); x__code = x__block(x__idx(1):length(x__block)); end % Assume the block will succeed. x__success = 1; x__msg = []; %%% SHARED if (strcmp (x__type, 'shared')) x__istest = 0; % Separate initialization code from variables. x__idx = find (x__code == sprintf('\n')); if (isempty (x__idx)) x__vars = x__code; x__code = ''; else x__vars = x__code (1:x__idx(1)-1); x__code = x__code (x__idx(1):length(x__code)); end % Strip comments off the variables. x__idx = find(x__vars == '%'); if (~ isempty (x__idx)) x__vars = x__vars(1:x__idx(1)-1); end % Assign default values to variables. try x__vars = deblank (x__vars); if (~ isempty (x__vars)) x__shared_names = {}; while ~isempty(x__vars), [x__shared_names{end+1}, x__vars] = strtok(x__vars, ', '); end x__shared_vals = repmat({[]}, 1, length(x__shared_names)); else x__shared_names = {}; x__shared_vals = {}; end catch % Couldn't declare, so don't initialize. x__code = ''; x__success = 0; x__msg = sprintf ('%sshared variable initialization failed\n', ... SIGNAL_FAIL); end % Initialization code will be evaluated below. elseif (strcmp (x__type, 'end')) % end simply declares the end of a previous function block. % There is no processing to be done here, just skip to next block. x__istest = 0; x__code = ''; %%% ASSERT elseif strcmp(x__type, 'assert') x__istest = 1; % Put the keyword back on the code. x__code = x__block; % The code will be evaluated below as a test block. %%% ERROR/WARNING elseif (strcmp (x__type, 'error') || strcmp(x__type, 'warning')) x__istest = 1; x__warning = strcmp (x__type, 'warning'); [x__pattern, x__id, x__code] = getpattern (x__code); if (x__id) x__patstr = ['id=',x__id]; else x__patstr = ['<',x__pattern,'>']; end % FIXME: in the Octave version, syntax errors are counted as % failure, even for an 'error' block. This won't be the case here. if (x__success) x__success = 0; %x__warnstate = warning ('query', 'quiet'); %warning ('on', 'quiet'); try % This code is supposed to fail, so we don't save the output % into x__shared_vals. eval_test_code(x__code, x__shared_names, x__shared_vals{:}); if (~ x__warning) x__msg = sprintf ('%sexpected %s but got no error\n', ... SIGNAL_FAIL, x__patstr); else if (~ isempty (x__id)) [ignore_arg, x__err] = lastwarn; x__mismatch =~strcmp (x__err, x__id); else x__err = trimerr (lastwarn, 'warning'); x__mismatch = isempty (regexp (x__err, x__pattern, 'once')); end %warning (x__warnstate.state, 'quiet'); if (isempty (x__err)) x__msg = sprintf ('%sexpected %s but got no warning\n', ... SIGNAL_FAIL, x__patstr); elseif (x__mismatch) x__msg = sprintf ('%sexpected %s but got %s\n', ... SIGNAL_FAIL, x__patstr, x__err); else x__success = 1; end end catch if (~ isempty (x__id)) [ignore_arg, x__err] = lasterr(); x__mismatch =~strcmp (x__err, x__id); else x__err = trimerr (lasterr(), 'error'); x__mismatch = isempty (regexp (x__err, x__pattern, 'once')); end %warning (x__warnstate.state, 'quiet'); if (x__warning) x__msg = sprintf ('%sexpected warning %s but got error %s\n', ... SIGNAL_FAIL, x__patstr, x__err); elseif (x__mismatch) x__msg = sprintf ('%sexpected %s but got %s\n', ... SIGNAL_FAIL, x__patstr, x__err); else x__success = 1; end end clear x__testx__; end % Code already processed. x__code = ''; %%% TEST elseif (strcmp (x__type, 'test') || strcmp (x__type, 'xtest')) x__istest = 1; % Code will be evaluated below. %%% Comment block. elseif ((x__block(1) == '%') || (x__block(1) == '#')) x__istest = 0; x__code = ''; % skip the code %%% Unknown block. else x__istest = 1; x__success = 0; x__msg = sprintf ('%sunknown test type!\n', SIGNAL_FAIL); x__code = ''; % skip the code end % evaluate code for test, shared, and assert. if (~ isempty(x__code)) try % FIXME: need to check for embedded test functions, which cause % segfaults, until issues with subfunctions in functions are resolved. embed_func = regexp (x__code, '^\s*function ', 'once', 'lineanchors'); if (isempty (embed_func)) [x__shared_vals{:}] = eval_test_code(x__code, ... x__shared_names, x__shared_vals{:}); else error (['Functions embedded in %!test blocks are not allowed.\n', ... 'Use the %!function/%!end syntax instead to define shared functions for testing.\n']); end catch if (strcmp (x__type, 'xtest')) x__msg = sprintf ('%sknown failure\n%s', SIGNAL_FAIL, lasterr ()); nb_expected_failures = nb_expected_failures + 1; else x__msg = sprintf ('%stest failed\n%s', SIGNAL_FAIL, lasterr ()); x__success = 0; end if (isempty (lasterr ())) error ('empty error text, probably Ctrl-C --- aborting'); end end clear x__testx__; end % All done. Remember if we were successful and print any messages. if (~ isempty (x__msg)) % Make sure the user knows what caused the error. if (~ x__verbose) fprintf (x__fid, '%s%s\n', SIGNAL_BLOCK, x__block); fflush (x__fid); end fprintf(x__fid, '%s', x__msg); fprintf(x__fid, '%s', sprintf('\n')); fflush (x__fid); % FIXME: Dump the shared variables to x__fid... Octave uses fdisp() % to do that, but Matlab doesn't have this function end if (x__success == 0) x__all_success = 0; % Stop after one error if not in batch mode. if (~ x__batch) if (nargout > 0) x__ret1 = 0; x__ret2 = 0; end if (x__close_fid) fclose(x__fid); end return; end end x__tests = x__tests + x__istest; x__successes = x__successes + x__success * x__istest; end if nargout == 0 if x__tests || (nb_expected_failures > 0) if (nb_expected_failures) fprintf ('PASSES %d out of %d tests (%d expected failures)\n', ... x__successes, x__tests, nb_expected_failures); else fprintf ('PASSES %d out of %d tests\n', x__successes, x__tests); end else fprintf ('%s%s has no tests available\n', SIGNAL_EMPTY, x__file); end elseif (nargout == 1) x__ret1 = x__all_success; else x__ret1 = x__successes; x__ret2 = x__tests; x__ret3 = nb_expected_failures; end end % function %%%%%%%%%%%%%%%%%% % eval_test_code % %%%%%%%%%%%%%%%%%% % % Evaluate a block of code in a 'controlled' environment. % function varargout = eval_test_code(x__code, x__list_shared, varargin) % Check input arguments if length(x__list_shared) ~= length(varargin), error('Incorrect argument sizes.'); end % Protect variable names x__list_shared, x__i for i = 1:length(x__list_shared), if strcmp(x__list_shared{i}, 'x__list_shared'), error('x__list_shared cannot be used as a shared variable'); elseif strcmp(x__list_shared{i}, 'x__i'), error('x__i cannot be used as a shared variable'); end end % Prepare shared variables for x__i = 1:length(x__list_shared) eval(sprintf('%s = varargin{%d};', x__list_shared{x__i}, x__i)); end % Run the code if exist ('OCTAVE_VERSION', 'builtin') == 5 % Octave % Run without output capture (evalc is not implemented yet in Octave) eval (x__code); else % Matlab % Run with output capture % (TODO: compare the output with a reference, if provided) gobble_output = evalc (x__code); %#ok end % Save shared variables varargout = cell(1, length(x__list_shared)); for x__i = 1:length(x__list_shared), if ~exist(x__list_shared{x__i}, 'var'), varargout{x__i} = []; else varargout{x__i} = eval(x__list_shared{x__i}); end end end % function %%%%%%%%%%%%%% % getpattern % %%%%%%%%%%%%%% % % Strip from ' code'. % Also handles 'id=ID code' % function [pattern, id, rest] = getpattern (str) pattern = '.'; id = []; rest = str; str = trimleft (str); if (~ isempty (str) && str(1) == '<') close = index (str, '>'); if (close) pattern = str(2:close-1); rest = str(close+1:end); end elseif (strncmp (str, 'id=', 3)) [id, rest] = strtok (str(4:end)); end end % function %%%%%%%%%%% % trimerr % %%%%%%%%%%% % % Strip '.*prefix:' from '.*prefix: msg\n' and strip trailing blanks. % function msg = trimerr (msg, prefix) idx = index (msg, [prefix, ':']); if (idx > 0) msg(1:idx+length(prefix)) = []; end msg = trimleft (deblank (msg)); end % function %%%%%%%%%%%% % trimleft % %%%%%%%%%%%% % % Strip leading blanks from string. % function str = trimleft (str) idx = find (isspace (str)); leading = find (idx == 1:length(idx)); if (~ isempty (leading)) str = str(leading(end)+1:end); end end % function %%%%%%%%%%%%%%%%%%%%%%%% % x__extract_test_code % %%%%%%%%%%%%%%%%%%%%%%%% % function body = x__extract_test_code (nm) fid = fopen (nm, 'rt'); if fid == -1, error(sprintf('File %s cannot be opened.', nm)); end body = ''; if (fid >= 0) while (~ feof (fid)) ln = fgetl (fid); if (length (ln) >= 2 && strcmp (ln(1:2), '%!')) body = [body, sprintf('\n')]; if (length(ln) > 2) body = [body, ln(3:end)]; end end end fclose (fid); end end % function %% Tests of 'assert' blocks %!assert(isempty([])) % support for test assert shorthand %!assert((1 + 1) == 2) %% Tests of shared variables % Default: variables are not shared between blocks. %!test a=1; %!test assert(~exist('a')); % 'shared' blocks allow to declare a variable shared by several blocks %!shared a % create a shared variable %!test a = 3; % assign to a shared variable %!test assert(a == 3); % variable should equal 3 in this second 'test' block % Each 'shared' blocks deletes previously declared shared variables %!shared b, c % replace shared variables {'a'} --> {'b', 'c'} %!test assert(~exist('a')); % a no longer exists %!test assert(isempty(b)); % variables start off empty %!shared a % recreate a shared variable that had been deleted %!test assert (isempty(a)); % it is empty, even though it was equal to 3 before %!shared a, b, c % creates three shared variables %! a = 1; b = 2; c = 3; % give values to all variables, in the same block %!assert(isequal([a, b, c], [1, 2, 3])); % test all of them together %!test c=6; % update a value %!test % show that the update sticks between blocks %! assert(isequal([a, b, c], [1, 2, 6])); %!shared % clear all shared variables %!assert(~exist('a')) % show that they are cleared %% Tests for 'error' and 'warning' blocks %!error test % not enough input arguments %!error test(1, 2, 3, 4) % too many input args %!error garbage % usage on nonexistent function should be % When used without a pattern <>, 'error' block succeed on any error %!error stt_test('test', 'bogus'); % undefined function error %!error stk_test('test', 'bogus'); % error raised by stk_test itself % !test lastwarn(); % clear last warning just in case % !warning % we expect a warning msg including "worry about" % ! warning('Don''t worry about this warning'); %% Tests the behaviour of stk_test() itself % The number of input arguments should be between one and three %!error stk_test(); %!error stk_test('disp', 'verbose', [], 'extra arg !!!'); % The first argument of stk_test() must be a non-empty string %!error stk_test([]) %!error stk_test(0.0) % The second argument of stk_test() must be a either empty, or one of the %%! following strings: normal, quiet, verbose %!error stk_test('stk_mindist', 0.0) %!error stk_test('stk_mindist', 'dudule') %% Failure tests % All the following should fail. These tests should be disabled unless you % are developing stk_test() since users don't like to be presented with % expected failures. Use % ! to disable. % !xtest error('This test is known to fail') % expected failure % !test error('---------Failure tests. Use test(''test'',''verbose'',1)'); % !test assert(1 == 2); % !bogus % unknown block type % !error toeplitz([1,2,3]); % correct usage % !shared garbage in % variables must be comma separated % !test }{ % syntax errors fail properly % !error 'succeeds.'; % error test fails if code succeeds % !error error('message') % error pattern must match stk/inst/misc/test/stk_test_class.m0000644000000000000000000000543113156161544014650 0ustar % STK_TEST_CLASS is a unit test that any STK class should pass % Copyright Notice % % Copyright (C) 2017 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function stk_test_class (classname, verbose) if nargin < 2 verbose = false; end test_list = { ... 'default_constructor_doesnt_crash', ... 'default_constructor_return_type', ... 'isequal_argin1', ... 'isequal_2_self', ... 'isequal_3_self', ... 'isequal_2_zero', ... 'isequal_3_zero' }; for i = 1:(length (test_list)) fname = ['stk_test_class__' test_list{i}]; if verbose, fprintf ('stk_test_class #1: %s... ', fname); end try feval (fname, classname); if verbose, fprintf ('OK\n'); end catch if verbose, fprintf ('FAILED.\n'); end rethrow (lasterror ()); end end end % function function stk_test_class__default_constructor_doesnt_crash (classname) x = feval (classname); end function stk_test_class__default_constructor_return_type (classname) x = feval (classname); if ~ strcmp (class (x), classname) error (sprintf ('Returned object is not of class %s.', classname)); end end function stk_test_class__isequal_argin1 (classname) x = feval (classname); try b = isequal (x); %#ok<> error (sprintf ('isequal (x) does not fail for class %s.', classname)); end end function stk_test_class__isequal_2_self (classname) x = feval (classname); assert (isequal (x, x)); end function stk_test_class__isequal_3_self (classname) x = feval (classname); assert (isequal (x, x, x)); end function stk_test_class__isequal_2_zero (classname) x = feval (classname); assert (~ isequal (x, 0)); assert (~ isequal (0, x)); end function stk_test_class__isequal_3_zero (classname) x = feval (classname); assert (~ isequal (x, x, 0)); assert (~ isequal (x, 0, x)); assert (~ isequal (0, x, x)); assert (~ isequal (x, 0, 0)); assert (~ isequal (0, x, 0)); assert (~ isequal (0, 0, x)); end %#ok<*SPERR,*DEFNU,*TRYNC,*NASGU> stk/inst/misc/test/stk_test_dfbinaryop.m0000644000000000000000000000315413156161544015700 0ustar % STK_TEST_DFBINARYOP ... % Copyright Notice % % Copyright (C) 2013 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function stk_test_dfbinaryop (F, a1, a2) try x1 = stk_dataframe (a1); x2 = stk_dataframe (a2); res = feval (F, a1, a2); x3 = feval (F, x1, x2); assert (isa (x3, 'stk_dataframe') && isequal (double (x3), res)); x3 = feval (F, x1, a2); assert (isa (x3, 'stk_dataframe') && isequal (double (x3), res)); x3 = feval (F, a1, a2); assert (isequal (x3, res)); catch err = lasterror (); if strcmp (err.message, ['octave_base_value::array_value(): ' ... 'wrong type argument `class''']) warning (msg.message); else rethrow (err); end end % try end % function stk/inst/misc/text/0000755000000000000000000000000013156161544011447 5ustar stk/inst/misc/text/stk_disp_examplewelcome.m0000644000000000000000000000255613156161544016544 0ustar % STK_DISP_EXAMPLEWELCOME % Copyright Notice % % Copyright (C) 2012, 2013 SUPELEC % % Authors: Julien Bect % Emmanuel Vazquez % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function stk_disp_examplewelcome () stack = dbstack (); if length(stack) >= 2, demo_name = stack(2).name; display_help = true; else demo_name = 'This is a demo example...'; display_help = false; end fprintf ('\n%s\n', stk_sprintf_framed (demo_name)); if display_help help (demo_name); end end % function stk/inst/misc/text/stk_disp_getformat.m0000644000000000000000000000637013156161544015523 0ustar % STK_DISP_GETFORMAT [STK internal] % % CALL: [FMT, SPC] = stk_disp_getformat () % % NOTE % % This function solves a Matlab/Octave compatibility issue. See: % % * https://savannah.gnu.org/bugs/?51035 % * https://savannah.gnu.org/bugs/?49951 % * https://savannah.gnu.org/bugs/?46034 % * https://sourceforge.net/p/kriging/tickets/73 % Copyright Notice % % Copyright (C) 2017 CentraleSupelec % % Authors: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function [fmt, spc] = stk_disp_getformat () persistent method if isempty (method) method = choose_method (); end switch method case 1 % Matlab and some versions of Octave (e.g., 4.0.3) % Note: 'Format' and 'FormatSpacing' have been removed from the public % list of root properties since Matlab R2014b, but are still recommended % as the proper way to obtain this information in R2017a's manual. fmt = get (0, 'Format'); spc = get (0, 'FormatSpacing'); case 2 % Octave 4.2 for sure (when was it introduced ?) % In Octave 4.2.0 the 'Format' and 'FormatSpacing' root property have % been removed, but __formattring__ and __compactformat__ are still % available. fmt = feval ('__formatstring__'); spc = feval ('__compactformat__'); case 3 % Octave > 4.2 % After Octave 4.2.0, __formattring__ and __compactformat__ have been % removed too, and a new syntax is available. [fmt, spc] = format (); otherwise % If nothing works, I really don't know which version of Octave or % Matlab you are using, but defaulting to 'short' + 'loose' in this case % seems better than a warning or an error. fmt = 'short'; spc = 'loose'; end % switch end % function function method = choose_method () try spc = get (0, 'FormatSpacing'); assert (ismember (spc, {'compact', 'loose'})); method = 1; catch if exist ('__compactformat__', 'builtin') == 5 method = 2; else try [fmt, spc] = format (); %#ok CG#07 assert (ismember (spc, {'compact', 'loose'})); method = 3; catch method = 4; end % try end % if end % try end % function stk/inst/misc/text/stk_disp_isloose.m0000644000000000000000000000275113156161544015207 0ustar % STK_DISP_ISLOOSE [STK internal] % % CALL: ISLOOSE = stk_disp_isloose () % % returns true if a 'loose' display mode is used, and false otherwise. % % NOTE % % This function solves a Matlab/Octave compatibility issue. See: % % * https://savannah.gnu.org/bugs/?51035 % * https://savannah.gnu.org/bugs/?49951 % * https://savannah.gnu.org/bugs/?46034 % * https://sourceforge.net/p/kriging/tickets/73 % Copyright Notice % % Copyright (C) 2017 CentraleSupelec % % Authors: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function b = stk_disp_isloose () [fmt, spc] = stk_disp_getformat (); %#ok CG#07 b = strcmp (spc, 'loose'); end % function stk/inst/misc/text/stk_disp_progress.m0000644000000000000000000000352313156161544015374 0ustar % STK_DISP_PROGRESS ... % % Example: % % for i = 1:1000, % stk_disp_progress ('toto ', i, 1000); % end % % See also: waitbar % Copyright Notice % % Copyright (C) 2014 SUPELEC % % Authors: Emmanuel Vazquez % Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function stk_disp_progress (msg, n, N) if nargin > 3, stk_error ('Too many input arguments.', 'TooManyInputArgs'); end if ~ ((n > 0) && (n <= N)) stk_error ('n should be between 1 and N', 'InvalidArgument'); end persistent revmsg if n == 1 revmsg = []; end % Print current progress message msg = sprintf (msg, n, N); fprintf ([revmsg, msg]); % Prepare for erasing next time revmsg = repmat (sprintf ('\b'), 1, length (msg)); if n == N fprintf ('\n'); end end % function %!error stk_disp_progress ('toto ', 0, 1); %!test stk_disp_progress ('toto ', 1, 1); %!error stk_disp_progress ('toto ', 2, 1); %!test %! stk_disp_progress ('toto ', 1, 2); %! stk_disp_progress ('toto ', 2, 2); stk/inst/misc/text/stk_sprintf_colvect.m0000644000000000000000000000347613156161544015724 0ustar % STK_SPRINTF_COLVECT ... % Copyright Notice % % Copyright (C) 2013 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function str = stk_sprintf_colvect (x, max_width) if nargin < 2, max_width = 8; end % Try fixed-point notation first. [str, err_fp] = stk_sprintf_colvect_fixedpoint (x, max_width); if err_fp > 0, % Accept fixed-point notation if the error is zero, % try scientific notation otherwise. [str_sc, err_sc] = stk_sprintf_colvect_scientific (x, max_width); if err_sc < err_fp, % Choose scientific notation if it's better than fixed-point str = str_sc; end end end % function %!shared s %!test s = stk_sprintf_colvect ([1 1e1], 6); %!assert (isequal (s, [' 1'; '10'])) %!test s = stk_sprintf_colvect ([1 1e3], 6); %!assert (isequal (s, [' 1'; '1000'])) %!test s = stk_sprintf_colvect ([1 1e5], 6); %!assert (isequal (s, [' 1'; '100000'])) %!test s = stk_sprintf_colvect ([1 1e6], 6); %!assert (isequal (s, ['1e+00'; '1e+06'])) stk/inst/misc/text/stk_sprintf_colvect_fixedpoint.m0000644000000000000000000001012613156161544020143 0ustar % STK_SPRINTF_COLVECT_FIXEDPOINT ... % Copyright Notice % % Copyright (C) 2013, 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function [str, err] = stk_sprintf_colvect_fixedpoint(x, max_width) if isempty(x), str = ''; err = 0; return; end if nargin < 2, max_width = 8; end % turn x into a column vector x = double(x); x = x(:); % get rid of infinities is_inf = isinf (x); is_pos = (x > 0); is_pinf = is_inf & is_pos; is_minf = is_inf & (~ is_pos); x(is_inf) = 0.0; % get rid of negative zeros is_zero = (x == 0); x(is_zero) = 0.0; % Is there any negative element ? any_negative = any(x < 0); % Start without decimal part ax = abs(x); n1 = max(1, floor(log10(max(ax))) + 1); n2 = 0; n3 = any_negative; % Abort this is already too long if (n1 + n2 + n3) > max_width str = repmat('#', length(x), max_width); err = +inf; return; end % Otherwise, this is our current best solution best_err = max(abs(fix(x) - x)); best_n2 = 0; % Should we add a decimal part ? if (best_err > eps) && ((n1 + n2 + n3 + 2) <= max_width) % We can add a decimal part, so let's do it... while (best_err > eps) && ((n1 + n2 + n3) < max_width) n2 = n2 + 1; % add one decimal n3 = 1 + any_negative; % +1 for the comma c = 10 ^ (-n2); xx = (round (ax / c)) * c; err = max (abs (ax - xx)); if err < best_err, best_err = err; best_n2 = n2; end end end err = best_err; n2 = best_n2; fmt = sprintf ('%%%d.%df', n1 + n2 + n3, n2); str = arrayfun (@(u) sprintf (fmt, u), x, 'UniformOutput', false); str = char (str{:}); % fix infinities if any (is_pinf), str(is_pinf, :) = [repmat(' ', 1, max_width - 3) 'Inf']; end if any (is_minf) str(is_minf, :) = [repmat(' ', 1, max_width - 4) '-Inf']; end end % function %!shared x, s %! x = [1.2; 3.48]; %!test s = stk_sprintf_colvect_fixedpoint(x, 1); %!assert (isequal(s, ['1'; '3'])) %!test s = stk_sprintf_colvect_fixedpoint(x, 2); %!assert (isequal(s, ['1'; '3'])) %!test s = stk_sprintf_colvect_fixedpoint(x, 3); %!assert (isequal(s, ['1.2'; '3.5'])) %!test s = stk_sprintf_colvect_fixedpoint(x, 4); %!assert (isequal(s, ['1.20'; '3.48'])) %!test s = stk_sprintf_colvect_fixedpoint(x, 5); %!assert (isequal(s, ['1.20'; '3.48'])) %!shared x, s %! x = [1.2; -3.48]; %!test s = stk_sprintf_colvect_fixedpoint(x, 1); %!assert (isequal(s, ['#'; '#'])) %!test s = stk_sprintf_colvect_fixedpoint(x, 2); %!assert (isequal(s, [' 1'; '-3'])) %!test s = stk_sprintf_colvect_fixedpoint(x, 3); %!assert (isequal(s, [' 1'; '-3'])) %!test s = stk_sprintf_colvect_fixedpoint(x, 4); %!assert (isequal(s, [' 1.2'; '-3.5'])) %!test s = stk_sprintf_colvect_fixedpoint(x, 5); %!assert (isequal(s, [' 1.20'; '-3.48'])) %!test s = stk_sprintf_colvect_fixedpoint(x, 6); %!assert (isequal(s, [' 1.20'; '-3.48'])) %!shared x, s %! x = [0.2; 0.48]; %!test s = stk_sprintf_colvect_fixedpoint(x, 1); %!assert (isequal(s, ['0'; '0'])) %!test s = stk_sprintf_colvect_fixedpoint(x, 2); %!assert (isequal(s, ['0'; '0'])) %!test s = stk_sprintf_colvect_fixedpoint(x, 3); %!assert (isequal(s, ['0.2'; '0.5'])) %!test s = stk_sprintf_colvect_fixedpoint(x, 4); %!assert (isequal(s, ['0.20'; '0.48'])) %!test s = stk_sprintf_colvect_fixedpoint(x, 5); %!assert (isequal(s, ['0.20'; '0.48'])) stk/inst/misc/text/stk_sprintf_colvect_scientific.m0000644000000000000000000001577013156161544020124 0ustar % STK_SPRINTF_COLVECT_SCIENTIFIC ... % Copyright Notice % % Copyright (C) 2015 CentraleSupelec % Copyright (C) 2013, 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function [str, err] = stk_sprintf_colvect_scientific (x, max_width) if isempty (x), str = ''; err = 0; return; end if nargin < 2, max_width = 8; end % Turn x into a column vector x = double (x); x = x(:); % Get rid of infinities is_inf = isinf (x); is_pos = (x > 0); is_pinf = is_inf & is_pos; is_minf = is_inf & (~ is_pos); x(is_inf) = 0.0; % Get rid of negative zeros is_zero = (x == 0); x(is_zero) = 0.0; % Compute exponents ax = abs (x); exponent = zeros (size (x)); exponent(~is_zero) = floor (log10 (ax(~ is_zero))); % Compute mantissae mantissa = x .* 10 .^ (- exponent); % Is there any negative element ? any_negative = any (x < 0); %--- Start with only one digit for the mantissa -------------------------------- % Nb digits for the mantissa (including the leading digit) n1 = 1; % Compute mantissa/exponent after rounding [mantissa_r, exponent_r] = round_ (mantissa, exponent, n1); % Maximal absolute exponent maxexp = max (abs (exponent_r)); % Nb digits for the exponent n2 = max (2, 1 + floor (log10 (maxexp))); % Nb non-digit characters (+2 for "e+") -> no decimal separator in this case n3 = any_negative + 2; % Abort this is already too long if (n1 + n2 + n3) > max_width str = repmat ('#', length (x), max_width); err = +inf; return; end % Otherwise, this is our current best solution best_err = abs (x - mantissa_r .* 10 .^ (exponent_r)); best_n1 = 1; %--- Try to add a decimal part ------------------------------------------------- if (any (best_err > eps * abs (x))) && ((n1 + n2 + n3 + 2) <= max_width) % We can add a decimal part, so let's do it... while (any (best_err > eps * abs (x))) && ((n1 + n2 + n3) < max_width) % Increase numer of digits for the mantissa (including the leading digit) n1 = n1 + 1; % Compute mantissa/exponent after rounding [mantissa_r, exponent_r] = round_ (mantissa, exponent, n1); % Maximal absolute exponent maxexp = max (abs (exponent_r)); % Nb digits for the exponent n2 = max (2, 1 + floor (log10 (maxexp))); % Nb non-digit characters (+2 for "e+") % --> "+3" for "e", "." in the mantissa and "+" in the exponent n3 = any_negative + 3; err = abs (x - mantissa_r .* 10 .^ (exponent_r)); if (max (err) < max (best_err)) best_err = err; best_n1 = n1; end end end n1 = best_n1; %--- Produce formatted output ------------------------------------------------- % Compute mantissa/exponent after rounding [mantissa_r, exponent_r] = round_ (mantissa, exponent, n1); % format specifier for the mantissa fmt1 = sprintf ('%%%d.%df', n1 + (n1 > 1) + any_negative, n1 - 1); str1 = arrayfun (@(u)(sprintf (fmt1, u)), mantissa_r, 'UniformOutput', false); % format specifier for the exponent fmt2 = sprintf('e%%+0%dd', n2 + 1); str2 = arrayfun (@(u)(sprintf (fmt2, u)), exponent_r, 'UniformOutput', false); % merge mantissa and exponent str = [char(str1{:}) char(str2{:})]; % fix infinities if any (is_pinf), str(is_pinf, :) = [repmat(' ', 1, max_width - 3) 'Inf']; end if any (is_minf) str(is_minf, :) = [repmat(' ', 1, max_width - 4) '-Inf']; end % Compute the maximal error if nargout > 1, err = max (abs (x - mantissa_r .* 10 .^ (exponent_r))); end end % function function [mantissa_r, exponent_r] = round_ (mantissa, exponent, n1) % Round mantissa to n1 digits (including the leading digit) y = 10 ^ (n1 - 1); mantissa_r = round (mantissa * y) / y; exponent_r = exponent; % Fix mantissa values of 10 after rounding b = (abs (mantissa_r) == 10); mantissa_r(b) = sign (mantissa_r(b)); exponent_r(b) = exponent_r(b) + 1; end % function %!shared x, s %! x = [1.2; -34567]; %!test s = stk_sprintf_colvect_scientific(x, 1); %!assert (isequal(s, ['#'; '#'])) %!test s = stk_sprintf_colvect_scientific(x, 3); %!assert (isequal(s, ['###'; '###'])) %!test s = stk_sprintf_colvect_scientific(x, 5); %!assert (isequal(s, ['#####'; '#####'])) %!test s = stk_sprintf_colvect_scientific(x, 6); %!assert (isequal(s, [' 1e+00'; '-3e+04'])) %!test s = stk_sprintf_colvect_scientific(x, 7); %!assert (isequal(s, [' 1e+00'; '-3e+04'])) %!test s = stk_sprintf_colvect_scientific(x, 8); %!assert (isequal(s, [' 1.2e+00'; '-3.5e+04'])) %!test s = stk_sprintf_colvect_scientific(x, 9); %!assert (isequal(s, [' 1.20e+00'; '-3.46e+04'])) %!test s = stk_sprintf_colvect_scientific(x, 10); %!assert (isequal(s, [' 1.200e+00'; '-3.457e+04'])) %!test s = stk_sprintf_colvect_scientific(x, 11); %!assert (isequal(s, [' 1.2000e+00'; '-3.4567e+04'])) %!test s = stk_sprintf_colvect_scientific(x, 12); %!assert (isequal(s, [' 1.2000e+00'; '-3.4567e+04'])) %!shared x, s %! x = [0.9; 0.91; 0.99; 0.999]; %!test s = stk_sprintf_colvect_scientific (x, 4); %!assert (isequal(s, ['####'; '####'; '####'; '####'])) %!test s = stk_sprintf_colvect_scientific (x, 5); %!assert (isequal(s, ['9e-01'; '9e-01'; '1e+00'; '1e+00'])) %!test s = stk_sprintf_colvect_scientific (x, 6); %!assert (isequal(s, ['9e-01'; '9e-01'; '1e+00'; '1e+00'])) %!test s = stk_sprintf_colvect_scientific (x, 7); %!assert (isequal(s, ['9.0e-01'; '9.1e-01'; '9.9e-01'; '1.0e+00'])) %!test s = stk_sprintf_colvect_scientific (x, 8); %!assert (isequal(s, ['9.00e-01'; '9.10e-01'; '9.90e-01'; '9.99e-01'])) %!shared x, s %! x = [0.9; -0.91; 0.99; 0.999]; %!test s = stk_sprintf_colvect_scientific (x, 4); %!assert (isequal(s, ['####'; '####'; '####'; '####'])) %!test s = stk_sprintf_colvect_scientific (x, 5); %!assert (isequal(s, ['#####'; '#####'; '#####'; '#####'])) %!test s = stk_sprintf_colvect_scientific (x, 6); %!assert (isequal(s, [' 9e-01'; '-9e-01'; ' 1e+00'; ' 1e+00'])) %!test s = stk_sprintf_colvect_scientific (x, 7); %!assert (isequal(s, [' 9e-01'; '-9e-01'; ' 1e+00'; ' 1e+00'])) %!test s = stk_sprintf_colvect_scientific (x, 8); %!assert (isequal(s, [' 9.0e-01'; '-9.1e-01'; ' 9.9e-01'; ' 1.0e+00'])) %!test %! x = [1e6; -1e10; 1e-221]; %! s = stk_sprintf_colvect_scientific(x, 10); %! assert(isequal(s, [' 1e+006'; '-1e+010'; ' 1e-221'])); stk/inst/misc/text/stk_sprintf_framed.m0000644000000000000000000000226113156161544015512 0ustar % STK_SPRINTF_FRAMED writes formatted text into a frame. % Copyright Notice % % Copyright (C) 2012, 2013 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function s = stk_sprintf_framed(fmt, varargin) a = sprintf([' ' fmt ' '], varargin{:}); b = repmat('=', 1, length(a)); s = sprintf('#%s#\n#%s#\n#%s#\n', b, a, b); end % function stk/inst/param/0000755000000000000000000000000013156161544010630 5ustar stk/inst/param/classes/0000755000000000000000000000000013156161544012265 5ustar stk/inst/param/classes/stk_get_optimizable_parameters.m0000644000000000000000000000477113156161544020736 0ustar % STK_GET_OPTIMIZABLE_PARAMETERS [STK internal] % % CALL: VALUE = stk_get_optimizable_parameters (PARAM) % % returns the value of the 'optimizable_parameters' property of PARAM. % % NOTE: % % Numerical arrays are considered as a special kind of parameter object, for % which the 'optimizable_parameters' property is taken to be PARAM(:). % % INTERNAL FUNCTION WARNING: % % This function is currently considered as internal. STK users that wish to % experiment with parameter classes can already overload it, but should be % aware that API-breaking changes are likely to happen in future releases. % % See also: stk_set_optimizable_parameters % Copyright Notice % % Copyright (C) 2016, 2017 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function value = stk_get_optimizable_parameters (param) % This function will catch all calls to stk_get_optimizable_parameters for which % param is not an object of a "parameter class" (more precisely, a class that % implements stk_get_optimizable_parameters) if ~ isnumeric (param) try % Extract parameter values param = param(:); % Note: if param is an object, the previous line is actually a call to % subsref in disguise. This way of supporting parameter objects has % been introduced in STK 2.0.0 as an "experimental" feature. It is now % deprecated. catch stk_error (['stk_get_optimizable_parameters is not implemented for ' ... 'objects of class ', class(param), '.'], 'TypeMismatch'); end end % if % Make sure that the result is a column vector value = param(:); end % function stk/inst/param/classes/stk_set_optimizable_parameters.m0000644000000000000000000000476113156161544020751 0ustar % STK_SET_OPTIMIZABLE_PARAMETERS [STK internal] % % CALL: PARAM = stk_set_optimizable_parameters (PARAM, VALUE) % % sets to VALUE the 'optimizable_parameters' property of PARAM. The argument % VALUE is expected to be a numerical vector of the appropriate length. % % NOTE: % % Numerical arrays are considered as a special kind of parameter object, for % which the 'optimizable_parameters' property is taken to be PARAM(:). % % INTERNAL FUNCTION WARNING: % % This function is currently considered as internal. STK users that wish to % experiment with parameter classes can already overload it, but should be % aware that API-breaking changes are likely to happen in future releases. % % See also: stk_get_optimizable_parameters % Copyright Notice % % Copyright (C) 2016, 2017 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function param = stk_set_optimizable_parameters (param, value) % This function will catch all calls to stk_set_optimizable_parameters for which % neither param nor value is an object of a "parameter class" (more precisely, % a class that implements stk_set_optimizable_parameters) try % If param is numeric, the following syntax preserves its size and type param(:) = value; % Note: if param is an object, the previous line is actually a call to % subsasgn in disguise. This way of supporting parameter objects has been % introduced in STK 2.0.0 as an "experimental" feature. It is now % deprecated. catch stk_error (['stk_set_optimizable_parameters is not implemented for ' ... 'objects of class ', class(param), '.'], 'TypeMismatch'); end % if end % function stk/inst/param/estim/0000755000000000000000000000000013156161544011751 5ustar stk/inst/param/estim/stk_param_estim.m0000644000000000000000000002433513156161544015320 0ustar % STK_PARAM_ESTIM estimates the parameters of a covariance function % % CALL: PARAM = stk_param_estim (MODEL, XI, YI, PARAM0) % CALL: [PARAM, LNV] = stk_param_estim (MODEL, XI, YI, PARAM0) % % estimates the parameters PARAM of the covariance function in MODEL % from the data (XI, YI) using the restricted maximum likelihood (ReML) % method. The value PARAM0 is used as a starting point for local % optimization. % % The observations are assumed to be noisy if MODEL.lognoisevariance is % not -inf. In this case, the variance of the noise is estimated if % MODEL.lognoisevariance is nan, and assumed known otherwise. The % estimated log-variance is returned as the second output argument LNV % (equal to MODEL.lognoisevariance when it is assumed to be known). % % CALL: PARAM = stk_param_estim (MODEL, XI, YI) % CALL: [PARAM, LNV] = stk_param_estim (MODEL, XI, YI) % % does the same thing but uses stk_param_init to provide a starting value % automatically. % % CALL: [PARAM, LNV] = stk_param_estim (MODEL, XI, YI, PARAM0, LNV0) % % additionally provides an initial guess LNV0 for the logarithm of the % noise variance. In this case the observations are automatically assumed % to be noisy, and the value of MODEL.lognoisevariance is ignored. % % CALL: PARAM = stk_param_estim (MODEL, XI, YI, PARAM0, [], CRIT) % CALL: [PARAM, LNV] = stk_param_estim (MODEL, XI, YI, PARAM0, LNV0, CRIT) % % uses the estimation criterion CRIT instead of the default ReML criterion. % % EXAMPLES: see, e.g., stk_example_kb02, stk_example_kb03, stk_example_kb04, % stk_example_kb06, stk_example_misc02 % Copyright Notice % % Copyright (C) 2015-2017 CentraleSupelec % Copyright (C) 2014 SUPELEC & A. Ravisankar % Copyright (C) 2011-2013 SUPELEC % % Authors: Julien Bect % Emmanuel Vazquez % Ashwin Ravisankar % Remi Stroh % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function [param_opt, lnv_opt, info] = stk_param_estim ... (model, xi, zi, param0, lnv0, criterion) if nargin > 6, stk_error ('Too many input arguments.', 'TooManyInputArgs'); end % Empty is the same as not provided if nargin < 6, criterion = []; end if nargin < 5, lnv0 = []; end if nargin < 4, param0 = []; end % size checking: xi, zi zi_data = double (zi); if ~ isequal (size (zi_data), [stk_length(xi) 1]), errmsg = 'zi should be a column, with the same number of rows as xi.'; stk_error (errmsg, 'IncorrectSize'); end % Warn about special case: constant response if (std (zi_data) == 0) warning ('STK:stk_param_estim:ConstantResponse', ['Constant-response ' ... 'data: the output of stk_param_estim is likely to be unreliable.']); end % Make sure that lognoisevariance is -inf for noiseless models if ~ stk_isnoisy (model) model.lognoisevariance = -inf; end % Should we estimate the variance of the noise, too ? if ~ isempty (lnv0) % lnv0 present => noise variance *must* be estimated do_estim_lnv = true; if isnan (lnv0) || isinf (lnv0) stk_error (['Incorrect value for input argumen lnv0. The starting ' ... 'point for the estimation of lnv must be neither infinite nor ' ... 'NaN.'], 'InvalidArgument'); end else % Otherwise, noise variance estimation happens when lnv has NaNs lnv0 = model.lognoisevariance; do_estim_lnv = any (isnan (lnv0)); end if do_estim_lnv && (~ isscalar (lnv0)) stk_error (['Estimating the variance of the noise is not possible ' ... 'in the hetereoscedastic case yet. Sorry.'], 'InvalidArgument'); end % Default criterion: restricted likelihood (ReML method) if isempty (criterion) criterion = @stk_param_relik; end % param0: provide a value (if not provided as input argument) [param0, lnv0] = provide_param0_value (model, xi, zi, param0, lnv0); % lnv0: try stk_param_init_lnv if we still have no acceptable value if do_estim_lnv && (isnan (lnv0)) model.param = param0; lnv0 = stk_param_init_lnv (model, xi, zi); end % TODO: allow user-defined bounds [lb, ub] = stk_param_getdefaultbounds (model.covariance_type, param0, xi, zi); % Get vector of numerical parameters u0 = stk_get_optimizable_parameters (param0); if do_estim_lnv [lblnv, ublnv] = get_default_bounds_lnv (model, lnv0, xi, zi); lb = [lb ; lblnv]; ub = [ub ; ublnv]; u0 = [u0; lnv0]; end switch do_estim_lnv case false, f = @(u)(f_ (model, u, xi, zi, criterion)); case true, f = @(u)(f_with_noise_ (model, u, xi, zi, criterion)); end bounds_available = (~ isempty (lb)) && (~ isempty (ub)); if bounds_available A = stk_options_get ('stk_param_estim', 'minimize_box'); [u_opt, crit_opt] = stk_minimize_boxconstrained (A, f, u0, lb, ub); else A = stk_options_get ('stk_param_estim', 'minimize_unc'); [u_opt, crit_opt] = stk_minimize_unconstrained (A, f, u0); end if do_estim_lnv lnv_opt = u_opt(end); u_opt(end) = []; else lnv_opt = model.lognoisevariance; end % Create parameter object param_opt = stk_set_optimizable_parameters (model.param, u_opt); % Create 'info' structure, if requested if nargout > 2, info.criterion = criterion; info.crit_opt = crit_opt; info.lower_bounds = lb; info.upper_bounds = ub; end end % function %#ok<*CTCH,*LERR,*SPWRN,*WNTAG> %--- The objective function --------------------------------------------------- function [l, dl] = f_ (model, u, xi, zi, criterion) model.param = stk_set_optimizable_parameters (model.param, u); if nargout == 1, l = criterion (model, xi, zi); else [l, dl] = criterion (model, xi, zi); end end % function function [l, dl] = f_with_noise_ (model, u, xi, zi, criterion) model.param = stk_set_optimizable_parameters (model.param, u(1:end-1)); model.lognoisevariance = u(end); if nargout == 1, l = criterion (model, xi, zi); else [l, dl, dln] = criterion (model, xi, zi); dl = [dl; dln]; end end % function function [lblnv,ublnv] = get_default_bounds_lnv ... % -------------------------- (model, lnv0, xi, zi) %#ok TOLVAR = 0.5; % Bounds for the variance parameter empirical_variance = var(zi); lblnv = log (eps); ublnv = log (empirical_variance) + TOLVAR; % Make sure that lnv0 falls within the bounds if ~ isempty (lnv0) lblnv = min (lblnv, lnv0 - TOLVAR); ublnv = max (ublnv, lnv0 + TOLVAR); end end % function function [param0, lnv0] = provide_param0_value ... % --------------------------- (model, xi, zi, param0, lnv0) % param0: try to use input argument first if ~ isempty (param0) % Cast param0 into an object of the appropriate type param0 = stk_set_optimizable_parameters (model.param, param0); % Test if param0 contains nans if any (isnan (stk_get_optimizable_parameters (param0))) warning ('param0 has nans, calling stk_param_init instead'); param0 = []; end end % param0: try stk_param_init if we still have no acceptable value if isempty (param0) model.lognoisevariance = lnv0; [param0, lnv0] = stk_param_init (model, xi, zi); end end % function %!shared f, xi, zi, NI, param0, param1, model %! %! f = @(x)(- (0.8 * x + sin (5 * x + 1) + 0.1 * sin (10 * x)) ); %! DIM = 1; NI = 20; box = [-1.0; 1.0]; %! xi = stk_sampling_regulargrid (NI, DIM, box); %! %! SIGMA2 = 1.0; % variance parameter %! NU = 4.0; % regularity parameter %! RHO1 = 0.4; % scale (range) parameter %! param0 = log ([SIGMA2; NU; 1/RHO1]); %! %! model = stk_model ('stk_materncov_iso'); %!test % noiseless %! zi = stk_feval (f, xi); %! param1 = stk_param_estim (model, xi, zi, param0); %! assert (isequal (size (param1), size (param0))) % We cannot assume a DETERMINISTIC optimization algorithm % (for some reason, Octave's sqp is not exactly deterministic) %!test % same thing, with empty lnv0 (ok) %! param2 = stk_param_estim (model, xi, zi, param0, []); %! assert (stk_isequal_tolrel (param2, param1, 1e-2)) %!error % same thing, with lnv0 == NaN (not ok as a starting point) %! param2 = stk_param_estim (model, xi, zi, param0, nan); %!error % same thing, with lnv0 == -inf (not ok as a starting point) %! param2 = stk_param_estim (model, xi, zi, param0, -inf); %!test % same thing, with explicit value for 'criterion' %! param2 = stk_param_estim (model, xi, zi, param0, [], @stk_param_relik); %! assert (stk_isequal_tolrel (param1, param2, 1e-2)) %!test % noiseless %! zi = stk_feval (f, xi); %! param1 = stk_param_estim (model, xi, zi, param0); %! param2 = stk_param_estim (model, xi, zi, param0, [], @stk_param_relik); %! % We cannot assume a DETERMINISTIC optimization algorithm %! % (for some reason, Octave's sqp is not exactly deterministic) %! assert (stk_isequal_tolrel (param1, param2, 1e-2)) %!test % noisy %! NOISE_STD_TRUE = 0.1; %! NOISE_STD_INIT = 1e-5; %! zi = zi + NOISE_STD_TRUE * randn(NI, 1); %! model.lognoisevariance = 2 * log(NOISE_STD_INIT); %! [param, lnv] = stk_param_estim ... %! (model, xi, zi, param0, model.lognoisevariance); % Incorrect number of input arguments %!error param = stk_param_estim () %!error param = stk_param_estim (model); %!error param = stk_param_estim (model, xi); %!error param = stk_param_estim (model, xi, zi, param0, log(eps), @stk_param_relik, pi); %!test % Constant response %! model = stk_model ('stk_materncov52_iso'); %! n = 10; x = stk_sampling_regulargrid (n, 1, [0; 1]); z = ones (size (x)); %! param = stk_param_estim (model, x, z, model.param); %! assert ((all (isfinite (param))) && (length (param) == 2)); stk/inst/param/estim/stk_param_getdefaultbounds.m0000644000000000000000000001242513156161544017533 0ustar % STK_PARAM_GETDEFAULTBOUNDS provides lower/upper bounds for covariance parameters % % CALL: [LB, UB] = stk_param_getdefaultbounds (COVARIANCE_TYPE, PARAM0, XI, ZI) % % returns lower bounds LB and upper bounds UB for the optimization of the % parameters of a parameterized covariance function COVARIANCE_TYPE, given % the starting point PARAM0 of the optimization and the data (XI, ZI). % % NOTE: user-defined covariance functions % % For user-defined covariance functions, lower/upper bounds can be provided % using one of the following two approaches: % % a) if the covariance uses a dedicated class C for parameter values, % the prefered approach is to imlement stk_param_getdefaultbounds for % this class; % % b) otherwise, for a covariance function named mycov, simply provide a % function named mycov_defaultbounds. % Copyright Notice % % Copyright (C) 2017 CentraleSupelec % Copyright (C) 2015 CentraleSupelec & LNE % Copyright (C) 2011-2014 SUPELEC % % Authors: Julien Bect % Emmanuel Vazquez % Remi Stroh % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function [lb, ub] = stk_param_getdefaultbounds (covariance_type, param0, xi, zi) if isobject (param0) % param0 is an object from a class that does not implement % stk_param_getdefaultbounds (otherwise we wouldn't have ended up here). % We assume that this is a choice of the designer of the parameter class, % and therefore return [] without a warning. lb = []; ub = []; elseif ~ isfloat (param0) stk_error ('Incorrect type for param0.', 'TypeMismatch'); else % constants opts = stk_options_get ('stk_param_getdefaultbounds'); TOLVAR = opts.tolvar; TOLSCALE = opts.tolscale; % bounds for the variance parameter log_empirical_variance = log (var (double (zi))); if log_empirical_variance == - Inf logvar_lb = param0(1) - TOLVAR; logvar_ub = param0(1) + TOLVAR; else logvar_lb = min (log_empirical_variance, param0(1)) - TOLVAR; logvar_ub = max (log_empirical_variance, param0(1)) + TOLVAR; end dim = size (xi, 2); if ~ ischar (covariance_type) % Assume that model.covariance_type is a handle covariance_type = func2str (covariance_type); end switch covariance_type, case {'stk_materncov_aniso', 'stk_materncov_iso'} nu_lb = min (log (0.5), param0(2)); nu_ub = max (log (min (50, 10 * dim)), param0(2)); range_mid = param0(3:end); range_lb = range_mid(:) - TOLSCALE; range_ub = range_mid(:) + TOLSCALE; lb = [logvar_lb; nu_lb; range_lb]; ub = [logvar_ub; nu_ub; range_ub]; case { 'stk_materncov32_aniso', 'stk_materncov32_iso', ... 'stk_materncov52_aniso', 'stk_materncov52_iso', ... 'stk_expcov_aniso', 'stk_expcov_iso', ... 'stk_gausscov_aniso', 'stk_gausscov_iso', ... 'stk_sphcov_aniso', 'stk_sphcov_iso'} range_mid = param0(2:end); range_lb = range_mid(:) - TOLSCALE; range_ub = range_mid(:) + TOLSCALE; lb = [logvar_lb; range_lb]; ub = [logvar_ub; range_ub]; otherwise try % Undocumented feature: make it possible to define a % XXXX_getdefaultbounds function that provides parameter % bounds during estimation for a user-defined covariance % function called XXXX (in the case, where this covariance % has parameters type double). fname = [covariance_type '_getdefaultbounds']; [lb, ub] = feval (fname, param0, xi, zi); catch err = lasterror (); msg = strrep (err.message, sprintf ('\n'), sprintf ('\n|| ')); warning(['Unable to initialize covariance parameters ' ... 'automatically for covariance functions of type ''%s''.'... '\n\nEmpty bounds are returned.\n\nThe original error ' ... 'message was:\n|| %s\n'], covariance_type, msg); lb = []; ub = []; end end % switch end % if end % function stk/inst/param/estim/stk_param_gls.m0000644000000000000000000000727113156161544014764 0ustar % STK_PARAM_GLS computes a generalised least squares estimate % % CALL: BETA = stk_param_gls (MODEL, XI, ZI) % % computes the generalised least squares estimate BETA of the vector of % coefficients for the linear part of MODEL, where XI and ZI stand for % the evaluation points and observed responses, respectively. % % CALL: [BETA, SIGMA2] = stk_param_gls (MODEL, XI, ZI) % % also returns the associated unbiased estimate SIGMA2 of sigma^2, assu- % ming that the actual covariance matrix of the Gaussian process part of % the model is sigma^2 K, with K the covariance matrix built from MODEL. % % SIGMA2 is actually the "best" unbiased estimate of sigma^2 : % % 1 % SIGMA2 = ----- * || ZI - P BETA ||^2_{K^{-1}} % n - r % % where n is the number of observations, r the length of BETA, P the % design matrix for the linear part of the model, and || . ||_{K^{-1}} % the norm associated to the positive definite matrix K^{-1}. It is the % best estimate with respect to the quadratic risk, among all unbiased % estimates which are quadratic in the residuals. % Copyright Notice % % Copyright (C) 2015, 2016 CentraleSupelec % Copyright (C) 2014 SUPELEC & A. Ravisankar % Copyright (C) 2011-2013 SUPELEC % % Authors: Julien Bect % Emmanuel Vazquez % Ashwin Ravisankar % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function [beta, sigma2, L] = stk_param_gls (model, xi, zi) n = size (xi, 1); % Build the covariance matrix and the design matrix [K, P] = stk_make_matcov (model, xi); % Cast zi into a double-precision array zi = double (zi); % Compute the Generalized Least Squares (GLS) estimate L = stk_cholcov (K, 'lower'); W = L \ P; u = L \ zi; beta = (W' * W) \ (W' * u); if nargin > 1, % Assuming that the actual covariance matrice is sigma^2 K, compute the % "best" unbiased estimate of sigma2 (best wrt the quadratic risk, among % all unbiased estimates which are quadratic in the residuals) r = length (beta); sigma2 = 1 / (n - r) * sum ((u - W * beta) .^ 2); end end % end function stk_param_gls %!shared xi, zi, model, beta, sigma2 %! xi = (1:10)'; zi = sin (xi); %! model = stk_model ('stk_materncov52_iso'); %! model.param = [0.0 0.0]; %!test %! model.lm = stk_lm_constant (); %! [beta, sigma2] = stk_param_gls (model, xi, zi); %!assert (stk_isequal_tolabs (beta, 0.1346064, 1e-6)) %!assert (stk_isequal_tolabs (sigma2, 0.4295288, 1e-6)) %!test %! model.lm = stk_lm_affine (); %! [beta, sigma2] = stk_param_gls (model, xi, zi); %!assert (stk_isequal_tolabs (beta, [0.4728342; -0.0614960], 1e-6)) %!assert (stk_isequal_tolabs (sigma2, 0.4559431, 1e-6)) %!test %! model.lm = stk_lm_null (); %! [beta, sigma2] = stk_param_gls (model, xi, zi); %!assert (isequal (beta, zeros (0, 1))) %!assert (stk_isequal_tolabs (sigma2, 0.3977993, 1e-6)) stk/inst/param/estim/stk_param_init.m0000644000000000000000000004201613156161544015136 0ustar % STK_PARAM_INIT provides a starting point for stk_param_estim % % CALL: PARAM = stk_param_init (MODEL, XI, YI) % % provides a quick and dirty estimate of the parameters of MODEL based on the % data (XI, YI), that can be used as a starting point for stk_param_estim. It % selects the maximizer of the ReML criterion out of a list of possible values % given data (XI, YI). This syntax is appropriate for noiseless observations % and for noisy observations with known noise variance (i.e., when the % 'lognoisevariance' field in MODEL is either -Inf or has a finite value). % % CALL: [PARAM, LNV] = stk_param_init (MODEL, XI, YI) % % also returns a value for the 'lognoisevariance' field. In the case of % noiseless observations or noisy observations with known noise variance, this % is simply the value that was provided by the user in MODEL.lognoisevariance. % In the case where MODEL.lognoisevariance is NaN (noisy observation with % unknown noise variance), LNV is estimated by stk_param_init together with % PARAM. % % CALL: [PARAM, LNV] = stk_param_init (MODEL, XI, YI, BOX) % % takes into account the (hyper-rectangular) domain on which the model is % going to be used. It is used in the heuristics that determines the list of % parameter values mentioned above. BOX should be a 2 x DIM matrix with BOX(1, % j) and BOX(2, j) being the lower- and upper-bound of the interval on the % j^th coordinate, with DIM being the dimension of XI, DIM = size(XI,2). If % provided, If missing or empty, the BOX argument defaults to [min(XI); % max(XI)]. % % CALL: [PARAM, LNV] = stk_param_init (MODEL, XI, YI, BOX, DO_ESTIM_LNV) % % with DO_ESTIM_LNV = TRUE forces the estimation of the variance of the noise, % regardless of the value of MODEL.lognoisevariance. If FALSE, it prevents % estimation of the variance of the noise, which is only possible if the % 'lognoisevariance' field in MODEL is either -Inf or has a finite value. % % See also stk_example_kb02, stk_example_kb03, stk_example_misc03 % Copyright Notice % % Copyright (C) 2015, 2016 CentraleSupelec % Copyright (C) 2012-2014 SUPELEC % % Authors: Julien Bect % Paul Feliot % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function [param, lnv] = stk_param_init (model, varargin) cov_list = { ... 'stk_expcov_iso', ... 'stk_expcov_aniso', ... 'stk_gausscov_iso', ... 'stk_gausscov_aniso', ... 'stk_materncov_iso', ... 'stk_materncov_aniso', ... 'stk_materncov32_iso', ... 'stk_materncov32_aniso', ... 'stk_materncov52_iso', ... 'stk_materncov52_aniso', ... 'stk_sphcov_iso', ... 'stk_sphcov_aniso'}; if ~ ischar (model.covariance_type) % Assume that model.covariance_type is a handle model.covariance_type = func2str (model.covariance_type); end if ismember (model.covariance_type, cov_list) % An initialization for this covariance type is provided in STK [param, lnv] = stk_param_init_ (model, varargin{:}); else try % Undocumented feature: make it possible to define a XXXX_param_init % function that provides initial estimates for a user-defined % covariance function called XXXX. fname = [model.covariance_type '_param_init']; [param, lnv] = feval (fname, model, varargin{:}); catch err = lasterror (); msg = strrep (err.message, sprintf ('\n'), sprintf ('\n|| ')); msg = sprintf (['Unable to initialize covariance parameters ' ... 'automatically for covariance functions of type ''%s''.\n\nThe ' ... 'original error message was:\n|| %s\n'], model.covariance_type, msg); stk_error (msg, 'UnableToInitialize'); end % try_catch end % if end % function %#ok<*CTCH,*LERR> function [param, lnv] = stk_param_init_ (model, xi, zi, box, do_estim_lnv) if nargin > 5, stk_error ('Too many input arguments.', 'TooManyInputArgs'); end if ~ isequal (size (zi), [size(xi, 1) 1]), errmsg = 'zi should be a column, with the same number of rows as xi.'; stk_error (errmsg, 'IncorrectSize'); end %--- first, default values for arguments 'box' and 'noisy' --------------------- if nargin < 4, box = []; end if ~ isa (box, 'stk_hrect') if isempty (box), box = stk_boundingbox (xi); % Default: bounding box else box = stk_hrect (box); end end %--- backward compatiblity ----------------------------------------------------- % Make sure that lognoisevariance is -inf for noiseless models if ~ stk_isnoisy (model) model.lognoisevariance = -inf; end % Ensure backward compatiblity with respect to model.order / model.lm model = stk_model_fixlm (model); %--- lognoisevariance ? -------------------------------------------------------- lnv = model.lognoisevariance; % Noise variance estimation is not supported in the heteroscedastic case if (~ isscalar (lnv)) && (any (isnan (lnv))) stk_error (['model.lognoisevariance is non-scalar and contains nans. ' ... 'Noise variance estimation is not supported in the heteroscedastic ' ... 'case '], 'InvalidArgument'); end % Estimation of noise variance ? % * if do_estim_lnv is provided, use it to decide % * if not, estimation occurs when lnv is nan if nargin < 5 if isscalar (lnv) % In the homoscedastic case, estimate noise variance iff lnv is nan do_estim_lnv = isnan (lnv); else % Noise variance estimation is not supported in the heteroscedastic % case (see above). Heteroscedastic case with known noise variance: do_estim_lnv = false; end else % do_estim_lnv has been provided if isscalar (lnv) if do_estim_lnv lnv = nan; elseif isnan (lnv) stk_error (sprintf ... (['do_estim_lnv is false, but model.lognoisevariance ' ... 'is nan. If you don''t want the noise variance to be ' ... 'estimated, you must provide a value for it!']), ... 'MissingParameterValue'); end else % Noise variance estimation is not supported in the heteroscedastic % case (see above). if do_estim_lnv stk_error (['Noise variance estimation is not supported in the ' ... 'heteroscedastic case '], 'InvalidArgument'); end end end if (do_estim_lnv) && (nargout < 2) warning (['stk_param_init will be computing an estimation of the ' ... 'variance of the noise, perhaps should you call the function ' ... 'with two output arguments?']); end %--- then, each type of covariance is dealt with specifically ------------------ switch model.covariance_type case {'stk_expcov_iso', 'stk_materncov32_iso', 'stk_materncov52_iso', ... 'stk_gausscov_iso', 'stk_sphcov_iso'} [param, lnv] = paraminit_ (model.covariance_type, ... xi, zi, box, model.lm, lnv); case {'stk_expcov_aniso', 'stk_materncov32_aniso', ... 'stk_materncov52_aniso', 'stk_gausscov_aniso', 'stk_sphcov_aniso'} xi = stk_normalize (xi, box); c = [model.covariance_type(1:end-5) 'iso']; [param, lnv] = paraminit_ (c, xi, zi, [], model.lm, lnv); param = [param(1); param(2) - log(diff(box, [], 1))']; case 'stk_materncov_iso' nu = 5/2 * size (xi, 2); covname_iso = @(param, x, y, diff, pairwise) stk_materncov_iso ... ([param(1) log(nu) param(2)], x, y, diff, pairwise); [param, lnv] = paraminit_ (covname_iso, xi, zi, box, model.lm, lnv); param = [param(1); log(nu); param(2)]; case 'stk_materncov_aniso' nu = 5/2 * size (xi, 2); covname_iso = @(param, x, y, diff, pairwise) stk_materncov_iso ... ([param(1) log(nu) param(2)], x, y, diff, pairwise); xi = stk_normalize (xi, box); [param, lnv] = paraminit_ (covname_iso, xi, zi, [], model.lm, lnv); param = [param(1); log(nu); param(2) - log(diff(box, [], 1))']; otherwise errmsg = 'Unsupported covariance type.'; stk_error (errmsg, 'InvalidArgument'); end end % function function [param, lnv] = paraminit_ (covname_iso, xi, zi, box, lm, lnv) % Check for special case: constant response if (std (double (zi)) == 0) warning ('STK:stk_param_init:ConstantResponse', ... 'Parameter estimation is impossible with constant-response data.'); param = [0 0]; if any (isnan (lnv)), lnv = 0; end return % Return some default values end d = size (xi, 2); model = stk_model (covname_iso); model.lm = lm; model.lognoisevariance = lnv; % list of possible values for the ratio eta = sigma2_noise / sigma2 if (isscalar (lnv) && (lnv ~= -inf)) % Homoscedastic noisy case, with known or unknown noise variance eta_list = 10 .^ (-6:3:0); else % Noiseless case or heteroscedastic noisy case (known noise variance) eta_list = 0; end % list of possible values for the range parameter if isempty (box) % assume box = repmat([0; 1], 1, d) box_diameter = sqrt (d); else box_diameter = sqrt (sum (diff (box) .^ 2)); end rho_max = 2 * box_diameter; rho_min = box_diameter / 50; rho_list = logspace (log10 (rho_min), log10 (rho_max), 5); % Initialize parameter search eta_best = NaN; rho_best = NaN; sigma2_best = NaN; aLL_best = +Inf; % Homoscedastic case ? homoscedastic = (isscalar (lnv)); % Try all possible combinations of rho and eta from the lists for eta = eta_list for rho = rho_list % First use sigma2 = 1.0 model.param = [0.0, -log(rho)]; % The same code works for the noiseless case and for the case where lnv % must be estimated (in the first case, eta = 0 and thus lnv is -inf) if (eta == 0) || (homoscedastic && (isnan (lnv))) model.lognoisevariance = log (eta); [ignd, sigma2] = stk_param_gls (model, xi, zi); %#ok CG#07 if ~ (sigma2 > 0), continue; end log_sigma2 = log (sigma2); model.lognoisevariance = log (eta * sigma2); else % Known variances (homo- and hetero-scedastic cases) model.param = [0.0, -log(rho)]; log_sigma2 = (mean (lnv)) - (log (eta)); sigma2 = exp (log_sigma2); end % Now, compute the antilog-likelihood model.param(1) = log_sigma2; aLL = stk_param_relik (model, xi, zi); if ~isnan(aLL) && (aLL < aLL_best) eta_best = eta; rho_best = rho; aLL_best = aLL; sigma2_best = sigma2; end end end if isinf (aLL_best) errmsg = 'Couldn''t find reasonable parameter values... ?!?'; stk_error (errmsg, 'AlgorithmFailure'); end param = log ([sigma2_best; 1/rho_best]); if (isscalar (lnv)) && (isnan (lnv)) % Homoscedatic case with unknown variance... Here is our estimate: lnv = log (eta_best * sigma2_best); end end % function %!test %! xi = (1:10)'; zi = sin (xi); %! model = stk_model ('stk_materncov52_iso'); %! model.param = stk_param_init (model, xi, zi, [1; 10], false); %! xt = (1:9)' + 0.5; zt = sin (xt); %! zp = stk_predict (model, xi, zi, xt); %! assert (sum ((zt - zp.mean) .^ 2) < 1e-3); %!test % check equivariance of parameter estimates %! f = @(x) sin (x); %! xi = stk_sampling_regulargrid (10, 1); zi = stk_feval (f, xi); %! shift = 1000; scale = 0.01; %! model = stk_model ('stk_materncov32_iso'); %! p1 = stk_param_init (model, xi, zi); %! p2 = stk_param_init (model, xi, shift + scale .* zi); %! assert (stk_isequal_tolabs (p2(1), p1(1) + log (scale^2), 1e-10)) %! assert (stk_isequal_tolabs (p2(2), p1(2), eps)) %!shared xi, zi, BOX, xt, zt %! %! f = @(x)(- (0.8 * x + sin (5 * x + 1) + 0.1 * sin (10 * x))); %! DIM = 1; % Dimension of the factor space %! BOX = [-1.0; 1.0]; % Factor space %! %! xi = stk_sampling_regulargrid (20, DIM, BOX); % Evaluation points %! zi = stk_feval (f, xi); % Evaluation results %! %! NT = 400; % Number of points in the grid %! xt = stk_sampling_regulargrid (NT, DIM, BOX); % Generate a regular grid %! zt = stk_feval (f, xt); % Values of f on the grid %!test %! model = stk_model ('stk_materncov_iso'); %! [param0, model.lognoisevariance] = stk_param_init (model, xi, zi, BOX); %! model.param = stk_param_estim (model, xi, zi, param0); %! zp = stk_predict (model, xi, zi, xt); %! assert (max ((zp.mean - zt) .^ 2) < 1e-3) %!test %! model = stk_model ('stk_materncov_aniso'); %! [param0, model.lognoisevariance] = stk_param_init (model, xi, zi, BOX); %! model.param = stk_param_estim (model, xi, zi, param0); %! zp = stk_predict (model, xi, zi, xt); %! assert (max ((zp.mean - zt) .^ 2) < 1e-3) %!test %! model = stk_model ('stk_materncov32_iso'); %! [param0, model.lognoisevariance] = stk_param_init (model, xi, zi, BOX); %! model.param = stk_param_estim (model, xi, zi, param0); %! zp = stk_predict (model, xi, zi, xt); %! assert (max ((zp.mean - zt) .^ 2) < 1e-3) %!test %! model = stk_model ('stk_materncov32_aniso'); %! [param0, model.lognoisevariance] = stk_param_init (model, xi, zi, BOX); %! model.param = stk_param_estim (model, xi, zi, param0); %! zp = stk_predict (model, xi, zi, xt); %! assert (max ((zp.mean - zt) .^ 2) < 1e-3) %!test %! model = stk_model ('stk_materncov52_iso'); %! [param0, model.lognoisevariance] = stk_param_init (model, xi, zi, BOX); %! model.param = stk_param_estim (model, xi, zi, param0); %! zp = stk_predict (model, xi, zi, xt); %! assert (max ((zp.mean - zt) .^ 2) < 1e-3) %!test %! model = stk_model ('stk_materncov52_aniso'); %! [param0, model.lognoisevariance] = stk_param_init (model, xi, zi, BOX); %! model.param = stk_param_estim (model, xi, zi, param0); %! zp = stk_predict (model, xi, zi, xt); %! assert (max ((zp.mean - zt) .^ 2) < 1e-3) %!test %! model = stk_model ('stk_gausscov_iso'); %! [param0, model.lognoisevariance] = stk_param_init (model, xi, zi, BOX); %! model.param = stk_param_estim (model, xi, zi, param0); %! zp = stk_predict (model, xi, zi, xt); %! assert (max ((zp.mean - zt) .^ 2) < 1e-3) %!test %! model = stk_model ('stk_gausscov_aniso'); %! [param0, model.lognoisevariance] = stk_param_init (model, xi, zi, BOX); %! model.param = stk_param_estim (model, xi, zi, param0); %! zp = stk_predict (model, xi, zi, xt); %! assert (max ((zp.mean - zt) .^ 2) < 1e-3) %!test % Homoscedastic case / do_estim_lnv = true %! model = stk_model ('stk_materncov32_iso'); %! [model.param, model.lognoisevariance] = ... %! stk_param_init (model, xi, zi, BOX, true); %! [model.param, model.lognoisevariance] = ... %! stk_param_estim (model, xi, zi); %! zp = stk_predict (model, xi, zi, xt); %! assert (model.lognoisevariance > -inf); %! assert (max ((zp.mean - zt) .^ 2) < 1e-3) %!error % Homoscedastic case / do_estim_lnv = false / model.lnv = nan %! model = stk_model ('stk_materncov32_iso'); %! model.lognoisevariance = nan; % not compatible with do_estim_lnv == false %! [model.param, model.lognoisevariance] = ... %! stk_param_init (model, xi, zi, BOX, false); %!error % Heteroscedastic case / do_estim_lnv = true %! model = stk_model ('stk_materncov32_iso'); %! lnv = log ((100 + rand (size (zi))) / 1e6); %! model.lognoisevariance = lnv; % here we say that lnv is known %! [param0, model.lognoisevariance] = stk_param_init (model, xi, zi, BOX, true); %!test % Heteroscedastic case / known noise variance %! model = stk_model ('stk_materncov32_iso'); %! lnv = log ((100 + rand (size (zi))) / 1e6); %! model.lognoisevariance = lnv; % here we say that lnv is known %! [param0, model.lognoisevariance] = stk_param_init (model, xi, zi, BOX); %! model.param = stk_param_estim (model, xi, zi, param0); %! zp = stk_predict (model, xi, zi, xt); %! assert (isequal (model.lognoisevariance, lnv)); % should be untouched %! assert (max ((zp.mean - zt) .^ 2) < 1e-3) %!shared model, x, z %! model = stk_model ('stk_materncov52_iso'); %! n = 10; x = stk_sampling_regulargrid (n, 1, [0; 1]); z = ones (size (x)); %!test % Constant response, noiseless model %! [param, lnv] = stk_param_init (model, x, z); %! assert ((all (isfinite (param))) && (length (param) == 2)); %! assert (isequal (lnv, -inf)); %!test % Constant response, noisy model %! model.lognoisevariance = nan; %! [param, lnv] = stk_param_init (model, x, z); %! assert ((all (isfinite (param))) && (length (param) == 2)); %! assert (isscalar (lnv) && isfinite (lnv)); stk/inst/param/estim/stk_param_init_lnv.m0000644000000000000000000000665213156161544016023 0ustar % STK_PARAM_INIT_LNV provides a rough estimate of the variance of the noise % % CALL: LNV = stk_param_init_lnv (MODEL, XI, YI) % % returns a rough estimate of the log of the noise variance computed using % the given MODEL and data (XI, YI), using the restricted maximum likelihood % (ReML) method. It selects the maximizer of the ReML criterion out of a % list of possible values. % % NOTE: assumption on the model % % The model is assumed to be a stationary Gaussian process, with % model.param(1) corresponding to the log of the Gaussian process variance. % This assumption is currently fulfilled by all the models shipped with STK. % % See also: stk_param_estim, stk_param_init % Copyright Notice % % Copyright (C) 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function lnv = stk_param_init_lnv (model, xi, zi) if nargin > 3, stk_error ('Too many input arguments.', 'TooManyInputArgs'); end % size checking: xi, zi if ~ isequal (size (zi), [size(xi, 1) 1]), errmsg = 'zi should be a column, with the same number of rows as xi.'; stk_error (errmsg, 'IncorrectSize'); end % Warn about special case: constant response if (std (double (zi)) == 0) warning ('STK:stk_param_estim_lnv:ConstantResponse', ['Constant- ' ... 'response data: the output of stk_param_estim_lnv is likely ' ... 'to be unreliable.']); end % Make sure that lognoisevariance is -inf for noiseless models if ~ stk_isnoisy (model) model.lognoisevariance = -inf; end % We will work with the ratio eta = sigma2_noise / sigma2 log_eta_min = -15; % exp(-15) = 3e-7 approx -> very small noise log_eta_max = +15; % exp(+15) = 3e+7 approx -> very large noise log_eta_list = linspace (log_eta_min, log_eta_max, 5); % Initialize parameter search log_eta_best = nan; aLL_best = +inf; % Try all values from log_eta_list for log_eta = log_eta_list model.lognoisevariance = model.param(1) + log_eta; aLL = stk_param_relik (model, xi, zi); if (~ isnan (aLL)) && (aLL < aLL_best) log_eta_best = log_eta; aLL_best = aLL; end end if isinf (aLL_best) errmsg = 'Couldn''t find reasonable parameter values... ?!?'; stk_error (errmsg, 'AlgorithmFailure'); end lnv = model.param(1) + log_eta_best; end % function %!test %! f = @(x)(- (0.8 * x + sin (5 * x + 1) + 0.1 * sin (10 * x))); %! ni = 20; %! xi = (linspace (-1, 1, ni))' + 0.2 * (randn (ni, 1)); %! zi = stk_feval (f, xi); %! %! model = stk_model ('stk_materncov_iso'); %! model.param = log ([1; 5/2; 1/0.4]); %! lnv = stk_param_init_lnv (model, xi, zi); %! %! assert ((isscalar (lnv)) && (lnv > -30) && (lnv < 30)); stk/inst/param/estim/stk_param_relik.m0000644000000000000000000001576113156161544015310 0ustar % STK_PARAM_RELIK computes the restricted likelihood of a model given data % % CALL: [ARL, dARL_dtheta, dARL_dLNV] = stk_param_relik (MODEL, XI, YI) % % computes the opposite of the restricted likelihood (denoted by ARL for % Anti-Restricted Likelihood) of MODEL given the data (XI, YI). The function % also returns the gradient dARL_dtheta of ARL with respect to the parameters % of the covariance function and the derivative dARL_dLNV of ARL with respect % to the logarithm of the noise variance. % % EXAMPLE: see paramestim/stk_param_estim.m % Copyright Notice % % Copyright (C) 2015, 2016 CentraleSupelec % Copyright (C) 2011-2014 SUPELEC % % Authors: Julien Bect % Emmanuel Vazquez % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function [rl, drl_param, drl_lnv] = stk_param_relik (model, xi, yi) if nargin > 3, stk_error ('Too many input arguments.', 'TooManyInputArgs'); end % Get numerical parameter vector from parameter object paramvec = stk_get_optimizable_parameters (model.param); PARAMPRIOR = isfield (model, 'prior'); NOISEPRIOR = isfield (model, 'noiseprior'); % Make sure that lognoisevariance is -inf for noiseless models if ~ stk_isnoisy (model) model.lognoisevariance = -inf; end n = size (xi, 1); %% Compute the (opposite of) the restricted log-likelihood [K, P] = stk_make_matcov (model, xi); q = size (P, 2); simple_kriging = (q == 0); if simple_kriging G = K; % No need to filter anything out else % Construct a "filtering matrix" A = W' [Q, R_ignored] = qr (P); %#ok %the second argument *must* be here W = Q(:, (q+1):n); % Compute G = W' * K * W (covariance matrix of filtered observations) M = (stk_cholcov (K)) * W; G = (M') * M; % Check if G is (at least close to) symmetric Delta = G - G'; s = sqrt (diag (G)); if any (abs (Delta) > eps * (s * s')) warning ('STK:stk_param_relik:NumericalAccuracyProblem', ... 'The computation of G = W'' * K * W is inaccurate.'); G = 0.5 * (G + G'); % Make it at least symmetric end end % Cholesky factorization: G = C' * C, with upper-triangular C C = stk_cholcov (G); % Compute log (det (G)) using the Cholesky factor ldetWKW = 2 * sum (log (diag (C))); % Compute (W' yi)' * G^(-1) * (W' yi) as u' * u, with u = C' \ (W' * yi) if simple_kriging u = linsolve (C, double (yi), struct ('UT', true, 'TRANSA', true)); else u = linsolve (C, W' * double (yi), struct ('UT', true, 'TRANSA', true)); end attache = sum (u .^ 2); rl = 0.5 * ((n - q) * log(2 * pi) + ldetWKW + attache); %% Add priors if PARAMPRIOR delta_p = paramvec - model.prior.mean; rl = rl + 0.5 * delta_p' * model.prior.invcov * delta_p; end if NOISEPRIOR delta_lnv = model.lognoisevariance - model.noiseprior.mean; rl = rl + 0.5 * (delta_lnv ^ 2) / model.noiseprior.var; end %% Compute gradient if nargout >= 2 nbparam = length (paramvec); drl_param = zeros (nbparam, 1); if simple_kriging H = inv (G); else F = linsolve (C, W', struct ('UT', true, 'TRANSA', true)); H = F' * F; % = W * G^(-1) * W' end z = H * double (yi); for diff = 1:nbparam, V = feval (model.covariance_type, model.param, xi, xi, diff); drl_param(diff) = 1/2 * (sum (sum (H .* V)) - z' * V * z); end if PARAMPRIOR drl_param = drl_param + model.prior.invcov * delta_p; end if nargout >= 3, if model.lognoisevariance == -inf drl_lnv = nan; else diff = 1; V = stk_noisecov (n, model.lognoisevariance, diff); drl_lnv = 1/2 * (sum (sum (H .* V)) - z' * V * z); if NOISEPRIOR drl_lnv = drl_lnv + delta_lnv / model.noiseprior.var; end end end end end % function %!shared f, xi, zi, NI, model, J, dJ1, dJ2 %! %! f = @(x)(- (0.8 * x(:, 1) + sin (5 * x(:, 2) + 1) ... %! + 0.1 * sin (10 * x(:, 3)))); %! DIM = 3; NI = 20; box = repmat ([-1.0; 1.0], 1, DIM); %! xi = stk_sampling_halton_rr2 (NI, DIM, box); %! zi = stk_feval (f, xi); %! %! SIGMA2 = 1.0; % variance parameter %! NU = 4.0; % regularity parameter %! RHO1 = 0.4; % scale (range) parameter %! %! model = stk_model('stk_materncov_aniso'); %! model.param = log([SIGMA2; NU; 1/RHO1 * ones(DIM, 1)]); %!error [J, dJ1, dJ2] = stk_param_relik (); %!error [J, dJ1, dJ2] = stk_param_relik (model); %!error [J, dJ1, dJ2] = stk_param_relik (model, xi); %!test [J, dJ1, dJ2] = stk_param_relik (model, xi, zi); %!error [J, dJ1, dJ2] = stk_param_relik (model, xi, zi, pi); %!test %! TOL_REL = 0.01; %! assert (stk_isequal_tolrel (J, 21.6, TOL_REL)); %! assert (stk_isequal_tolrel (dJ1, [4.387 -0.1803 0.7917 0.1392 2.580]', TOL_REL)); %! assert (isnan (dJ2)); %!shared xi, zi, model, TOL_REL %! xi = [-1 -.6 -.2 .2 .6 1]'; %! zi = [-0.11 1.30 0.23 -1.14 0.36 -0.37]'; %! model = stk_model ('stk_materncov_iso'); %! model.param = log ([1.0 4.0 2.5]); %! model.lognoisevariance = log (0.01); %! TOL_REL = 0.01; %!test % Another simple 1D check %! [ARL, dARL_dtheta, dARL_dLNV] = stk_param_relik (model, xi, zi); %! assert (stk_isequal_tolrel (ARL, 6.327, TOL_REL)); %! assert (stk_isequal_tolrel (dARL_dtheta, [0.268 0.0149 -0.636]', TOL_REL)); %! assert (stk_isequal_tolrel (dARL_dLNV, -1.581e-04, TOL_REL)); %!test % Same 1D test with simple kriging %! model.lm = stk_lm_null; %! [ARL, dARL_dtheta, dARL_dLNV] = stk_param_relik (model, xi, zi); %! assert (stk_isequal_tolrel (ARL, 7.475, TOL_REL)); %! assert (stk_isequal_tolrel (dARL_dtheta, [0.765 0.0238 -1.019]', TOL_REL)); %! assert (stk_isequal_tolrel (dARL_dLNV, 3.0517e-03, TOL_REL)); %!test % Check the gradient on a 2D test case %! %! f = @stk_testfun_braninhoo; %! DIM = 2; %! BOX = [[-5; 10], [0; 15]]; %! NI = 20; %! TOL_REL = 1e-2; %! DELTA = 1e-6; %! %! model = stk_model ('stk_materncov52_iso', DIM); %! xi = stk_sampling_halton_rr2 (NI, DIM, BOX); %! zi = stk_feval (f, xi); %! %! model.param = [1 1]; %! [r1 dr] = stk_param_relik (model, xi, zi); %! %! model.param = model.param + DELTA * [0 1]; %! r2 = stk_param_relik (model, xi, zi); %! %! assert (stk_isequal_tolrel (dr(2), (r2 - r1) / DELTA, TOL_REL)); stk/inst/sampling/0000755000000000000000000000000013156161544011342 5ustar stk/inst/sampling/@stk_function/0000755000000000000000000000000013156161544014150 5ustar stk/inst/sampling/@stk_function/disp.m0000644000000000000000000000313413156161544015266 0ustar % @STK_FUNCTION/DISP [overload base function] % % See also: disp % Copyright Notice % % Copyright (C) 2016 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function disp (F) loose_spacing = stk_disp_isloose (); fprintf ('<%s>\n', stk_sprintf_sizetype (F)); if loose_spacing fprintf ('\n'); end if ~ strcmp (class (F), 'stk_function') %#ok fprintf ('*** WARNING: %s has no proper disp () method.\n', class (F)); if loose_spacing fprintf ('***\n'); end fprintf ('*** Dumping the raw content of the underlying structure...\n'); if loose_spacing fprintf ('***\n\n'); end disp (struct (F)); if loose_spacing fprintf ('\n'); end end % if end % function stk/inst/sampling/@stk_function/display.m0000644000000000000000000000236013156161544015774 0ustar % @STK_FUNCTION/DISPLAY [overload base function] % % See also: display % Copyright Notice % % Copyright (C) 2016 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function display (F) %#ok<*DISPLAY> loose_spacing = stk_disp_isloose (); name = inputname (1); if isempty (name) name = 'ans'; end if loose_spacing fprintf ('\n'); end fprintf ('%s = ', name); disp (F); end % function stk/inst/sampling/@stk_function/feval.m0000644000000000000000000000226413156161544015427 0ustar % @STK_FUNCTION/FEVAL [overload base function] % % See also: feval % Copyright Notice % % Copyright (C) 2017 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function F_val = feval (F, x, varargin) %#ok stk_error (sprintf ('Method feval is missing from class %s.', ... class (F)), 'Missing Method'); end % function stk/inst/sampling/@stk_function/get.m0000644000000000000000000000210013156161544015076 0ustar % @STK_SAMPCRIT_EI/GET [overload base function] % Copyright Notice % % Copyright (C) 2017 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function value = get (crit, propname) value = crit.(propname); end % function stk/inst/sampling/@stk_function/horzcat.m0000644000000000000000000000230213156161544015775 0ustar % @STK_FUNCTION/HORZCAT [overload base function] % % See also: horzcat % Copyright Notice % % Copyright (C) 2016 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function varargout = horzcat (varargin) stk_error (['Arrays of sampling criterion objects are not supported. ', ... 'Use cell arrays instead.'], 'IllegalOperation'); end % function stk/inst/sampling/@stk_function/stk_function.m0000644000000000000000000000477613156161544017052 0ustar % STK_FUNCTION [experimental] % % EXPERIMENTAL CLASS WARNING: This class is currently considered experimental. % STK users that wish to experiment with it are welcome to do so, but should % be aware that API-breaking changes are likely to happen in future releases. % We invite them to direct any questions, remarks or comments about this % experimental class to the STK mailing list. % % CALL: F = stk_function () % % creates a "pure" function object. Pure function objects are useless by % themselves, and typically constructed as parent objects for derived % function object classes (e.g., sampling criterion objects). % % See also: stk_sampcrit_ei, stk_sampcrit_eqi % Copyright Notice % % Copyright (C) 2017 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function F = stk_function () if nargin > 0 % Catch syntax errors (Octave only) stk_error ('Too many input arguments.', 'TooManyInputArgs'); end % if F = class (struct (), 'stk_function'); end % function %!shared F %!test F = stk_function () % ending ";" omitted on purpose, to test disp %!error F = stk_function (1.234) % too many input arguments %!error [F F]; % arrays of sampling criterion objects are not supported %!error [F; F]; % idem %!error get (F, 'toto'); % field does not exist %!error y = feval (F, 1.0); % not implemented for "pure" function objects %!error dummy = F{2}; % illegal indexing %!error dummy = F(1.0); % feval not implemented %!error dummy = F.toto; % field does not exist %!error F{2} = 1.234; % illegal indexing %!error F(5) = 1.234; % illegal indexing %!error F.toto = 1.234; % field does not exist stk/inst/sampling/@stk_function/subsasgn.m0000644000000000000000000000263513156161544016161 0ustar % @STK_FUNCTION/SUBSASGN [overload base function] % % See also: subsasgn % Copyright Notice % % Copyright (C) 2016 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function F = subsasgn (F, idx, value) switch idx(1).type case '.' if length (idx) > 1 value = subsasgn (get (F, idx(1).subs), idx(2:end), value); end F = set (F, idx(1).subs, value); case {'{}', '()'} errmsg = 'Illegal assignment'; stk_error (errmsg, 'IllegalAssignment'); end end % function stk/inst/sampling/@stk_function/subsref.m0000644000000000000000000000270513156161544016003 0ustar % @STK_FUNCTION/SUBSREF [overload base function] % % See also: subsref % Copyright Notice % % Copyright (C) 2016 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function [value, argout2] = subsref (F, idx) switch idx(1).type case '()' [value, argout2] = feval (F, idx(1).subs{:}); case '{}' errmsg = 'Indexing with curly braces is not allowed.'; stk_error (errmsg, 'IllegalIndexing'); case '.' value = get (F, idx(1).subs); end if (length (idx)) > 1 value = subsref (value, idx(2:end)); end end % function stk/inst/sampling/@stk_function/vertcat.m0000644000000000000000000000230213156161544015773 0ustar % @STK_FUNCTION/VERTCAT [overload base function] % % See also: vertcat % Copyright Notice % % Copyright (C) 2016 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function varargout = vertcat (varargin) stk_error (['Arrays of sampling criterion objects are not supported. ', ... 'Use cell arrays instead.'], 'IllegalOperation'); end % function stk/inst/sampling/@stk_sampcrit_akg/0000755000000000000000000000000013156161544014767 5ustar stk/inst/sampling/@stk_sampcrit_akg/disp.m0000644000000000000000000000343313156161544016107 0ustar % @STK_SAMPCRIT_AKG/DISP [overload base function] % % See also: disp % Copyright Notice % % Copyright (C) 2016, 2017 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function disp (crit) loose_spacing = stk_disp_isloose (); fprintf ('<%s>\n', stk_sprintf_sizetype (crit)); if loose_spacing fprintf ('|\n'); end if isempty (crit.model) % Uninstantiated sampling criterion model_str = '-- (not instantiated)'; else % Instantiated sampling criterion model_str = sprintf ('<%s>', stk_sprintf_sizetype (crit.model)); end if isempty (crit.reference_grid) % Uninstantiated sampling criterion xr_str = '-- (use current evaluation points)'; else % Instantiated sampling criterion xr_str = sprintf ('<%s>', stk_sprintf_sizetype (crit.reference_grid)); end fprintf ('| model: %s\n', model_str); fprintf ('| reference_grid: %s\n', xr_str); if loose_spacing fprintf ('|\n\n'); end end % function stk/inst/sampling/@stk_sampcrit_akg/feval.m0000644000000000000000000000365613156161544016254 0ustar % @STK_SAMPCRIT_AKG/FEVAL [overload base function] % % See also: feval % Copyright Notice % % Copyright (C) 2016, 2017 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function [AKG, zp] = feval (crit, x, varargin) % Implementation note: stk_predict currently does not offer the possibility to % get the right-hand side of the kriging equation, which is needed here. So, % instead of calling stk_predict, we manipulate here the kriging equation object % directly... kreq = stk_make_kreq (crit.model, x); prior_model = get_prior_model (crit.model); zc_mean = (get (kreq, 'lambda'))' * (double (get_output_data (crit.model))); zc_var = stk_make_matcov (prior_model, x, x, true) - get (kreq, 'delta_var'); zc_std = sqrt (max (0, zc_var)); zcr_cov0 = stk_make_matcov (prior_model, x, crit.xr); zcr_cov = zcr_cov0 - (get (kreq, 'RS'))' * crit.zr_lambdamu; AKG = stk_sampcrit_akg_eval ... (zc_mean, zc_std, crit.zr_mean, crit.zr_std, zcr_cov); if nargout > 1 zp = stk_dataframe ([zc_mean zc_var], {'mean' 'var'}); end % FIXME: Loop over blocks, as in stk_predict ? end % function stk/inst/sampling/@stk_sampcrit_akg/get.m0000644000000000000000000000210113156161544015716 0ustar % @STK_SAMPCRIT_AKG/GET [overload base function] % Copyright Notice % % Copyright (C) 2017 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function value = get (crit, propname) value = crit.(propname); end % function stk/inst/sampling/@stk_sampcrit_akg/set.m0000644000000000000000000000475313156161544015751 0ustar % @STK_SAMPCRIT_AKG/SET [overload base function] % Copyright Notice % % Copyright (C) 2017 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function crit = set (crit, propname, value) switch propname case 'model' crit.model = value; crit = compute_zr_data (crit); case 'reference_grid' crit.reference_grid = double (value); if ~ isempty (crit.model) crit = compute_zr_data (crit); end otherwise errmsg = sprintf ('There is no property named %s', propname); stk_error (errmsg, 'InvalidArgument'); end % switch end % function function crit = compute_zr_data (crit) if isempty (crit.model) crit.xr = []; crit.zr_mean = []; crit.zr_std = []; crit.zr_lambdamu = []; else if isempty (crit.reference_grid) crit.xr = get_input_data (crit.model); else crit.xr = crit.reference_grid; end if isstruct (crit.model) % Prior model described by a structure (currently considered as improper % prior, since we have no way of distinguishing between proper and % improper priors...) crit.zr_mean = []; crit.zr_std = []; crit.zr_lambdamu = []; else [zp, lambda, mu] = stk_predict (crit.model, crit.xr); crit.zr_mean = zp.mean; crit.zr_std = sqrt (zp.var); crit.zr_lambdamu = [lambda; mu]; end % WARNING: the "mu" component of this lambdamu vector might be affected by a % scaling introduced by the kreq object. Do not use directly. end end % function stk/inst/sampling/@stk_sampcrit_akg/stk_sampcrit_akg.m0000644000000000000000000001425613156161544020502 0ustar % STK_SAMPCRIT_AKG [experimental] % % EXPERIMENTAL CLASS WARNING: This class is currently considered experimental. % STK users that wish to experiment with it are welcome to do so, but should % be aware that API-breaking changes are likely to happen in future releases. % We invite them to direct any questions, remarks or comments about this % experimental class to the STK mailing list. % % CALL: CRIT = stk_sampcrit_akg (MODEL) % % creates an AKG criterion object CRIT associated to MODEL. The input % argument MODEL can be empty, in which case CRIT is an uninstantiated % criterion object (to be instantiated later by setting the 'model' % property of CRIT). The reference grid is taken to be the current set of % evaluation points as in [1]. % % CALL: CRIT = stk_sampcrit_akg (MODEL, XR) % % uses XR as reference grid. % % FOR MORE INFORMATION % % Refer to the documentation of stk_sampcrit_akg_eval for more information. % % REFERENCES % % [1] W. Scott, P. I. Frazier and W. B. Powell. The correlated knowledge % gradient for simulation optimization of continuous parameters using % Gaussian process regression. SIAM J. Optim, 21(3):996-1026, 2011. % % See also: stk_sampcrit_akg_eval % Copyright Notice % % Copyright (C) 2017 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function crit = stk_sampcrit_akg (model, xr) if nargin > 2 stk_error ('Too many input arguments.', 'TooManyInputArgs'); end % Public properties crit.model = []; % read/write crit.reference_grid = []; % read/write % Private (hidden, read-only) properties crit.xr = []; crit.zr_mean = []; crit.zr_std = []; crit.zr_lambdamu = []; % Create default object crit = class (crit, 'stk_sampcrit_akg', stk_function ()); % Set user-defined value of reference_grid if (nargin >= 2) && (~ isempty (xr)) crit = set (crit, 'reference_grid', xr); end % Instantiate the sampling criterion with a model if (nargin >= 1) && (~ isempty (model)) crit = set (crit, 'model', model); end end % function %% % construct with nargin == 0 %!shared F, M, AKG %! M = stk_model_gpposterior (stk_model, [1 2 3]', [1.234 3 2]'); %!test F = stk_sampcrit_akg () % ending ";" omitted on purpose, to test disp %!assert (isempty (F.model)) %!assert (isempty (get (F, 'model'))) %!assert (isempty (F.reference_grid)) %!assert (isempty (get (F, 'reference_grid'))) %!error F.toto %!error get (F, 'toto') %!error F.toto = 1.234; % field does not exist %!error F = set (F, 'toto', 1.234); % field does not exist %!error AKG = feval (F, 1.0); %!test F = stk_sampcrit_akg (); F.model = M; %! assert (isequal (F.model, M)); %!test F = stk_sampcrit_akg (); F = set (F, 'model', M); %! assert (isequal (F.model, M)); %! assert (isequal (size (F.zr_mean), [3 1])) % n x 1 %! assert (isequal (size (F.zr_std), [3 1])) % n x 1 %! assert (isequal (size (F.zr_lambdamu), [4 3])) % (n+1) x n (constant mean) %!test F.model = []; % remove model %! assert (isempty (F.model)); %! assert (isempty (F.zr_mean)) %! assert (isempty (F.zr_std)) %! assert (isempty (F.zr_lambdamu)) % set reference grid when model is empty %!test xr = [1 1.5 2 2.5 3]'; %! F.reference_grid = xr % ending ";" omitted on purpose, to test disp %! assert (isequal (F.reference_grid, xr)) %! assert (isempty (F.zr_mean)) %! assert (isempty (F.zr_std)) %! assert (isempty (F.zr_lambdamu)) %!test F.reference_grid = []; %! assert (isempty (F.reference_grid)) % set reference grid when model is not empty %!test F = stk_sampcrit_akg (); F.model = M; %! assert (isequal (F.model, M)); %! xr = [1 1.5 2 2.5 3]'; %! F.reference_grid = xr % ending ";" omitted on purpose, to test disp %! assert (isequal (F.reference_grid, xr)) %! assert (isequal (size (F.zr_mean), [5 1])) % nr x 1 %! assert (isequal (size (F.zr_std), [5 1])) % nr x 1 %! assert (isequal (size (F.zr_lambdamu), [4 5])) % (n+1) x nr (constant mean) %!test F.reference_grid = []; %! assert (isempty (F.reference_grid)) %% % construct with nargin == 1; M is a proper (posterior) model %!test F = stk_sampcrit_akg (M) % ending ";" omitted on purpose, to test disp %!assert (isequal (F.model, M)) %!test AKG = feval (F, [1.0; 1.1; 1.2]); %!assert (isequal (size (AKG), [3 1])) %!assert (all (AKG >= 0)) %!test [AKG2, zp] = feval (F, [1.0; 1.1; 1.2]); %! assert (isequal (AKG2, AKG)); %! assert (isa (zp, 'stk_dataframe') && isequal (size (zp), [3 2])) %% % construct with nargin == 1; M is an improper (prior) model %!shared F, xr %! xr = [1 1.5 2 2.5 3]'; %!test F = stk_sampcrit_akg (stk_model ()); %!assert (isempty (F.reference_grid)) %!test F.reference_grid = xr; %!assert (isequal (F.reference_grid, xr)) %!assert (isempty (F.zr_mean)) %!assert (isempty (F.zr_std)) %!assert (isempty (F.zr_lambdamu)) %!error AKG = feval (F, 1.0); %% % construct with nargin == 2; M is a proper (posterior) model %!shared F, M, xr %! xr = [1 1.5 2 2.5 3]'; %! M = stk_model_gpposterior (stk_model, [1 2 3]', [1.234 3 2]'); %!test F = stk_sampcrit_akg (M, xr); %!assert (isequal (F.model, M)) %!assert (isequal (F.reference_grid, xr)) %!assert (isequal (size (F.zr_mean), [5 1])) % nr x 1 %!assert (isequal (size (F.zr_std), [5 1])) % nr x 1 %!assert (isequal (size (F.zr_lambdamu), [4 5])) % (n+1) x nr (constant mean) %!error F = stk_sampcrit_akg (M, xr, 1.234); % too many input arguments stk/inst/sampling/@stk_sampcrit_ei/0000755000000000000000000000000013156161544014622 5ustar stk/inst/sampling/@stk_sampcrit_ei/disp.m0000644000000000000000000000307213156161544015741 0ustar % @STK_SAMPCRIT_EI/DISP [overload base function] % % See also: disp % Copyright Notice % % Copyright (C) 2016, 2017 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function disp (crit) loose_spacing = stk_disp_isloose (); fprintf ('<%s>\n', stk_sprintf_sizetype (crit)); if loose_spacing fprintf ('|\n'); end if isempty (crit.model) % Uninstantiated sampling criterion model_str = '-- (not instantiated)'; else % Instantiated sampling criterion model_str = sprintf ('<%s>', stk_sprintf_sizetype (crit.model)); end fprintf ('| model: %s\n', model_str); fprintf ('| current_minimum: %s\n', num2str (crit.current_minimum)); if loose_spacing fprintf ('|\n\n'); end end % function stk/inst/sampling/@stk_sampcrit_ei/feval.m0000644000000000000000000000227013156161544016076 0ustar % @STK_SAMPCRIT_EI/FEVAL [overload base function] % % See also: feval % Copyright Notice % % Copyright (C) 2016, 2017 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function [EI, zp] = feval (crit, x, varargin) zp = stk_predict (crit.model, x); EI = stk_sampcrit_ei_eval (zp.mean, sqrt (zp.var), crit.current_minimum); end % function stk/inst/sampling/@stk_sampcrit_ei/get.m0000644000000000000000000000210013156161544015550 0ustar % @STK_SAMPCRIT_EI/GET [overload base function] % Copyright Notice % % Copyright (C) 2017 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function value = get (crit, propname) value = crit.(propname); end % function stk/inst/sampling/@stk_sampcrit_ei/set.m0000644000000000000000000000412713156161544015577 0ustar % @STK_SAMPCRIT_EI/SET [overload base function] % Copyright Notice % % Copyright (C) 2017 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function crit = set (crit, propname, value) switch propname case 'model' % Modifiable property if isempty (value) crit.model = []; crit.current_minimum = +inf; else % Set 'model' property crit.model = value; % Compute current minimum zi = get_output_data (crit.model); if isempty (zi) crit.current_minimum = +inf; else n = size (zi, 1); crit.current_minimum = min (zi); end end % if case 'current_min' % Read-only property stk_error (sprintf (['Property ''current_min'' is read-only.\n\n' ... 'WHY: The value of ''current_min'' is computed automatically ' ... 'from the input data of the model.']), 'ReadOnlyProperty'); otherwise errmsg = sprintf ('There is no property named %s', propname); stk_error (errmsg, 'InvalidArgument'); end % switch end % function stk/inst/sampling/@stk_sampcrit_ei/stk_sampcrit_ei.m0000644000000000000000000000710313156161544020161 0ustar % STK_SAMPCRIT_EI [experimental] % % EXPERIMENTAL CLASS WARNING: This class is currently considered experimental. % STK users that wish to experiment with it are welcome to do so, but should % be aware that API-breaking changes are likely to happen in future releases. % We invite them to direct any questions, remarks or comments about this % experimental class to the STK mailing list. % % CALL: CRIT = stk_sampcrit_ei (MODEL) % % creates an EI criterion object CRIT associated to MODEL. The input % argument MODEL can be empty, in which case CRIT is an uninstantiated % criterion object (to be instantiated later by setting the 'model' % property of CRIT). % % See also: stk_sampcrit_eqi % Copyright Notice % % Copyright (C) 2017 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function crit = stk_sampcrit_ei (model) if nargin > 1 stk_error ('Too many input arguments.', 'TooManyInputArgs'); end % Public properties crit.model = []; % read/write crit.current_minimum = inf; % read only % Create default object crit = class (crit, 'stk_sampcrit_ei', stk_function ()); % Instantiate the sampling criterion with a model if (nargin >= 1) && (~ isempty (model)) crit = set (crit, 'model', model); end end % function %!error F = stk_sampcrit_ei ([], 1.234); % too many input arguments %% % construct with nargin == 0 %!shared F, M, EI %! M = stk_model_gpposterior (stk_model, [1 2 3]', [1.234 3 2]'); %!test F = stk_sampcrit_ei () % ending ";" omitted on purpose, to test disp %!assert (isempty (F.model)) %!assert (isempty (get (F, 'model'))) %!assert (F.current_minimum == +inf) %!assert (get (F, 'current_minimum') == +inf) %!error F.toto %!error get (F, 'toto') %!error F.current_min = 1.234; % read-only %!error F = set (F, 'current_min', 1.234); % read-only %!error F.toto = 1.234; % field does not exist %!error F = set (F, 'toto', 1.234); % field does not exist %!error EI = feval (F, 1.0); %!test F = stk_sampcrit_ei (); F.model = M; %! assert (~ isempty (F.model)); %!test F = stk_sampcrit_ei (); F = set (F, 'model', M); %! assert (~ isempty (F.model)); %!test F.model = []; % remove model %! assert (isempty (F.model)); %! assert (F.current_minimum == +inf); %% % construct with nargin == 1; M is a proper (posterior) model %!test F = stk_sampcrit_ei (M) % ending ";" omitted on purpose, to test disp %!assert (isequal (F.model, M)) %!assert (F.current_minimum == 1.234); %!test EI = feval (F, [1.0; 1.1; 1.2]); %!assert (isequal (size (EI), [3 1])) %!assert (all (EI >= 0)) %% % construct with nargin == 1; M is an improper (prior) model %!shared F %!test F = stk_sampcrit_ei (stk_model ()); %!assert (F.current_minimum == +inf); %!error feval (F, 1.0); stk/inst/sampling/@stk_sampcrit_eqi/0000755000000000000000000000000013156161544015003 5ustar stk/inst/sampling/@stk_sampcrit_eqi/disp.m0000644000000000000000000000352213156161544016122 0ustar % @STK_SAMPCRIT_EQI/DISP [overload base function] % % See also: disp % Copyright Notice % % Copyright (C) 2016, 2017 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function disp (crit) loose_spacing = stk_disp_isloose (); fprintf ('<%s>\n', stk_sprintf_sizetype (crit)); if loose_spacing fprintf ('|\n'); end if isempty (crit.model) % Uninstantiated sampling criterion model_str = '-- (not instantiated)'; else % Instantiated sampling criterion model_str = sprintf ('<%s>', stk_sprintf_sizetype (crit.model)); end if isa (crit.point_batch_size, 'function_handle') pbs_str = func2str (crit.point_batch_size); else pbs_str = num2str (crit.point_batch_size); end fprintf ('| model: %s\n', model_str); fprintf ('| quantile_order: %s\n', num2str (crit.quantile_order)); fprintf ('| point_batch_size: %s\n', pbs_str); fprintf ('| current_minimum: %s\n', num2str (crit.current_minimum)); if loose_spacing fprintf ('|\n\n'); end end % function stk/inst/sampling/@stk_sampcrit_eqi/feval.m0000644000000000000000000000441513156161544016262 0ustar % @STK_SAMPCRIT_EQI/FEVAL [overload base function] % % See also: feval % Copyright Notice % % Copyright (C) 2016, 2017 CentraleSupelec % Copyright (C) EDF R&D % % Authors: Tom Assouline, Florent Autret & Stefano Duhamel (for EDF R&D) % Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function [EQI, zp] = feval (crit, x, tau2) zp = stk_predict (crit.model, x); zp_mean = zp.mean; zp_std = sqrt (zp.var); if nargin < 3 % If tau2 is missing, compute tau2 assuming that a batch of size % crit.point_batch_size will be made at the selected evaluation point. % Otherwise, use the value of tau2 provided as an input argument. Note % that the value of crit.point_batch_size is ignored in this second case. if stk_isnoisy (crit.model) if isa (crit.point_batch_size, 'function_handle') n = stk_length (get (crit.model, 'input_data')); pbs = feval (crit.point_batch_size, x, n); else pbs = crit.point_batch_size; end prior_model = get (crit.model, 'prior_model'); tau2 = (exp (prior_model.lognoisevariance)) / pbs; else tau2 = 0; end end tmp = (zp_std .^ 2) ./ (tau2 + zp_std .^ 2); tmp(zp_std == 0) = 0.0; quantile_moy = zp_mean + crit.quantile_value * (sqrt (tau2 .* tmp)); quantile_var = (zp_std .^ 2) .* tmp; EQI = stk_sampcrit_ei_eval ( ... quantile_moy, sqrt (quantile_var), crit.current_minimum); end % function stk/inst/sampling/@stk_sampcrit_eqi/get.m0000644000000000000000000000210013156161544015731 0ustar % @STK_SAMPCRIT_EI/GET [overload base function] % Copyright Notice % % Copyright (C) 2017 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function value = get (crit, propname) value = crit.(propname); end % function stk/inst/sampling/@stk_sampcrit_eqi/set.m0000644000000000000000000000753513156161544015766 0ustar % @STK_SAMPCRIT_EQI/SET [overload base function] % Copyright Notice % % Copyright (C) 2017 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function crit = set (crit, propname, value) switch propname case 'model' if isempty (value) crit.model = []; crit.current_minimum = +inf; else crit.model = value; crit.current_minimum = compute_current_minimum (crit); end case 'quantile_order' order = double (value); if (~ isscalar (order)) || (order < 0) || (order > 1) stk_error (['The value of property ''quantile_order'' ' ... 'must be a scalar between 0 and 1.'], 'InvalidArgument'); else crit.quantile_order = order; try crit.quantile_value = norminv (order); catch crit.quantile_value = - sqrt (2) * erfcinv (2 * order); % CG#09 end end if ~ isempty (crit.model) crit.current_minimum = compute_current_minimum (crit); end case 'point_batch_size' if ischar (value) crit.point_batch_size = str2func (value); elseif isa (value, 'function_handle') crit.point_batch_size = value; else % Last possibility: a fixed numeric value point_batch_size = double (value); if (~ isscalar (point_batch_size)) || (point_batch_size <= 0) ... || (point_batch_size ~= floor (point_batch_size)) stk_error ('Incorrect ''point_batch_size'' value', ... 'InvalidArgument'); else crit.point_batch_size = point_batch_size; end end case 'current_minimum' % Visible but read-only property stk_error (sprintf (['Property ''current_minimum'' is read-only.' ... '\n\nWHY: The value of ''current_minimum'' is computed ' ... 'automatically from the input data of the model.']), ... 'ReadOnlyProperty'); case 'quantile_value' % Hidden, read-only property stk_error (sprintf (['Property ''quantile_value'' is read-only.' ... '\n\nWHY: The value of ''quantile_value'' is computed ' ... 'automatically from the value of ''quantile_order''.']), ... 'ReadOnlyProperty'); otherwise errmsg = sprintf ('There is no property named %s', propname); stk_error (errmsg, 'InvalidArgument'); end % switch end % function function m = compute_current_minimum (crit) xi = get_input_data (crit.model); if isempty (xi) m = +inf; else zp = stk_predict (crit.model, xi); q = zp.mean + crit.quantile_value * (sqrt (zp.var)); m = min (q); end end % function stk/inst/sampling/@stk_sampcrit_eqi/stk_sampcrit_eqi.m0000644000000000000000000001516613156161544020533 0ustar % STK_SAMPCRIT_EQI [experimental] % % EXPERIMENTAL CLASS WARNING: This class is currently considered experimental. % STK users that wish to experiment with it are welcome to do so, but should % be aware that API-breaking changes are likely to happen in future releases. % We invite them to direct any questions, remarks or comments about this % experimental class to the STK mailing list. % % CALL: CRIT = stk_sampcrit_eqi (MODEL) % % creates an EQI criterion object CRIT associated to MODEL, where the % quantile of interest is the median of the output. The input argument % MODEL can be empty, in which case CRIT is an uninstantiated criterion % object (which can be instantiated later by setting the 'model' property % of CRIT). % % CALL: CRIT = stk_sampcrit_eqi (MODEL, P) % % uses quantile order P instead of the default 0.5. % % See also: stk_sampcrit_ei % Copyright Notice % % Copyright (C) 2017 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function crit = stk_sampcrit_eqi (model, quantile_order, point_batch_size) if nargin > 3 stk_error ('Too many input arguments.', 'TooManyInputArgs'); end % Public properties crit.model = []; crit.quantile_order = 0.5; crit.point_batch_size = 1; crit.current_minimum = inf; % Private (hidden, read-only) properties crit.quantile_value = 0.0; crit = class (crit, 'stk_sampcrit_eqi', stk_function ()); % Set user-defined value of quantile_order if (nargin >= 2) && (~ isempty (quantile_order)) crit = set (crit, 'quantile_order', quantile_order); end % Set user-defined value of point_batch_size if (nargin >= 3) && (~ isempty (point_batch_size)) crit = set (crit, 'point_batch_size', point_batch_size); end % Instantiate the sampling criterion with a model (it is important to do this % one last, to avoid re-computing current_minimum several times) if (nargin >= 1) && (~ isempty (model)) crit = set (crit, 'model', model); end end % function %!error F = stk_sampcrit_eqi ([], 0.5, 10, 1.234); % too many input arguments %% % construct with nargin == 0 %!shared F, M, EQI %! M = stk_model_gpposterior (stk_model, [1 2 3]', [1.234 3 2]'); %!test F = stk_sampcrit_eqi () % ending ";" omitted on purpose, to test disp %!assert (isempty (F.model)) %!assert (isempty (get (F, 'model'))) %!assert (F.quantile_order == 0.5) %!assert (get (F, 'quantile_order') == 0.5) %!assert (F.current_minimum == +inf) %!assert (get (F, 'current_minimum') == +inf) %!error F.toto %!error get (F, 'toto') %!error F.current_min = 1.234; % read-only %!error F = set (F, 'current_min', 1.234); % read-only %!error F.toto = 1.234; % field does not exist %!error F = set (F, 'toto', 1.234); % field does not exist %!test F.quantile_order = 0.9; assert (F.quantile_order == 0.9) %!test F = set (F, 'quantile_order', 0.8); assert (F.quantile_order == 0.8) %!error F.quantile_order = 1.1; %!error F.quantile_order = -0.1; %!error F.quantile_order = [1 2]; %!error F.current_minimum = 3.333; % read-only %!error F.quantile_value = 2.222; % read-only %!error EQI = feval (F, 1.0); %!test F = stk_sampcrit_eqi (); F.model = M; %! assert (~ isempty (F.model)); %!test F = stk_sampcrit_eqi (); F = set (F, 'model', M); %! assert (~ isempty (F.model)); %!test F.model = []; % remove model %! assert (isempty (F.model)); %! assert (F.current_minimum == +inf); %% % construct with nargin == 1; M is a proper (posterior) model %!test F = stk_sampcrit_eqi (M) % ending ";" omitted on purpose, to test disp %!assert (isequal (F.model, M)) %!assert (stk_isequal_tolrel (F.current_minimum, 1.234, 10 * eps)); %!test EQI = feval (F, [1.0; 1.1; 1.2]); %!assert (isequal (size (EQI), [3 1])) %!assert (all (EQI >= 0)) %!test F.quantile_order = 0.9; assert (F.quantile_order == 0.9) %% % same as the one before, but with a noisy model %!shared F, M, EQI %! prior_model = stk_model (); %! prior_model.lognoisevariance = 0.678; %! M = stk_model_gpposterior (prior_model, [1 2 3]', [1.234 3 2]'); %!test F = stk_sampcrit_eqi (M); %!assert (isequal (F.model, M)) %!assert (stk_isequal_tolrel (F.current_minimum, 2.077997, 1e-5)); %!test EQI = feval (F, [1.0; 1.1; 1.2]); %!assert (isequal (size (EQI), [3 1])) %!assert (all (EQI >= 0)) %!test F.quantile_order = 0.9; assert (F.quantile_order == 0.9) %% % construct with nargin == 1; M is an improper (prior) model %!shared F %!test F = stk_sampcrit_eqi (stk_model ()); %!assert (F.current_minimum == +inf); %!error feval (F, 1.0); %% % construct with nargin == 2 %!shared F, M %! M = stk_model_gpposterior (stk_model (), [1 2 3]', [1.234 3 2]'); %!error F = stk_sampcrit_eqi (M, [], 0); %!error F = stk_sampcrit_eqi (M, [], 1.5); %!error F = stk_sampcrit_eqi (M, [], nan); %!error F = stk_sampcrit_eqi (M, [], [10 20]); %!test F = stk_sampcrit_eqi (M, [], 10); %!assert (isequal (F.quantile_order, 0.5)); %!assert (isequal (F.point_batch_size, 10)); %!error F = stk_sampcrit_eqi (M, 0.8, 0); %!error F = stk_sampcrit_eqi (M, 0.8, 1.5); %!error F = stk_sampcrit_eqi (M, 0.8, nan); %!error F = stk_sampcrit_eqi (M, 0.8, [10 20]); %!test F = stk_sampcrit_eqi (M, 0.8, 5); %!assert (isequal (F.quantile_order, 0.8)); %!assert (isequal (F.point_batch_size, 5)); %% % test various forms for point_batch_size %!shared F, M, EQI %! prior_model = stk_model (); %! prior_model.lognoisevariance = 0.678; %! M = stk_model_gpposterior (prior_model, [1 2 3]', [1.234 3 2]'); %! F = stk_sampcrit_eqi (M); %!test F.point_batch_size = 10; % numeric %!assert (isequal (F.point_batch_size, 10)) %!test EQI = feval (F, [1.0; 1.1; 1.2]); %!test F.point_batch_size = @(x, n) 100 - n; % function handle %!assert (isa (F.point_batch_size, 'function_handle')) %!test EQI = feval (F, [1.0; 1.1; 1.2]); %!test F.point_batch_size = 'sin'; % char %!assert (isa (F.point_batch_size, 'function_handle')) stk/inst/sampling/stk_halfpintl.m0000644000000000000000000001276313156161544014373 0ustar % STK_HALFPINTL computes an intersection of lower half-planes % % CALL: [A, B, Z] = stk_halfpintl (A, B) % % computes the intersection of the lower half-planes defined by the vector % of slopes A and the vector of intercepts B. The output vectors A and B % contain the slopes and intercept of the lines that actually contribute to % the boundary of the intersection, sorted in such a way that the k^th % element corresponds to the k^th piece of the piecewise affine boundary. % The output Z contains the intersection points (shorter by one element). % % ALGORITHM % % The algorithm implemented in this function is described in [1, 2]. % % REFERENCE % % [1] P. I. Frazier, W. B. Powell, and S. Dayanik. The Knowledge-Gradient % Policy for Correlated Normal Beliefs. INFORMS Journal on Computing % 21(4):599-613, 2009. % % [2] W. Scott, P. I. Frazier and W. B. Powell. The correlated knowledge % gradient for simulation optimization of continuous parameters using % Gaussian process regression. SIAM J. Optim, 21(3):996-1026, 2011. % Copyright Notice % % Copyright (C) 2017 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function [a, b, z] = stk_halfpintl (a, b) % a: slopes % b: intercepts m = length (a); assert (isequal (size (a), [m 1])); assert (isequal (size (b), [m 1])); if m == 1 z = []; return end % 1) Sort by decreasing slopes (and increasing intercept in case of equality) tmp = [a b]; tmp = sortrows (tmp, [-1 2]); a_in = tmp(:, 1); b_in = tmp(:, 2); % 2) Prepare output lists a_out = nan (m, 1); % *at most* m lines in the output list b_out = nan (m, 1); z_out = nan (m - 1, 1); % the maximal number of intersections in m - 1, then a_out(1) = a_in(1); b_out(1) = b_in(1); k_in = 2; % index of the next input element to be analyzed k_out = 1; % index of the last element stored in the output list % 3) Process input list while k_in <= m if a_in(k_in) == a_out(k_out) % equality of slopes k_in = k_in + 1; else % inequality: a_in(k_in) < a_out(k_out) % Compute intersection z = (b_in(k_in) - b_out(k_out)) / (a_out(k_out) - a_in(k_in)); if (k_out == 1) || (z > z_out(k_out-1)) % Insert the new element at the end of the output list z_out(k_out) = z; k_out = k_out + 1; a_out(k_out) = a_in(k_in); b_out(k_out) = b_in(k_in); k_in = k_in + 1; else % Remove the last element of the output list k_out = k_out - 1; end end % if end % while a = a_out(1:k_out); b = b_out(1:k_out); z = z_out(1:(k_out - 1)); end % function %!test % case #1 %! a = 1; %! b = 1; %! [a_out, b_out, z_out] = stk_halfpintl (a, b); %! assert (a_out == 1) %! assert (b_out == 1) %! assert (isempty (z_out)) %!test % case #2: two lines, slopes not equal, already sorted %! a = [1; -1]; %! b = [0; 2]; %! [a_out, b_out, z_out] = stk_halfpintl (a, b); %! assert (isequal (a_out, [1; -1])) %! assert (isequal (b_out, [0; 2])) %! assert (z_out == 1) %!test % case #3: same as #2, but not sorted %! a = [-1; 1]; %! b = [ 2; 0]; %! [a_out, b_out, z_out] = stk_halfpintl (a, b); %! assert (isequal (a_out, [1; -1])) %! assert (isequal (b_out, [0; 2])) %! assert (z_out == 1) %!test % case #4: two lines, equal slopes, already sorted %! a = [0; 0]; %! b = [1; 2]; %! [a_out, b_out, z_out] = stk_halfpintl (a, b); %! assert (a_out == 0) %! assert (b_out == 1) %! assert (isempty (z_out)) %!test % case #5: same as #4, but not sorted %! a = [0; 0]; %! b = [2; 1]; %! [a_out, b_out, z_out] = stk_halfpintl (a, b); %! assert (a_out == 0) %! assert (b_out == 1) %! assert (isempty (z_out)) %!test % case #6: add a dominated line to #2 (the result does not change) %! a = [1; -1; 0]; %! b = [0; 2; 1]; %! [a_out, b_out, z_out] = stk_halfpintl (a, b); %! assert (isequal (a_out, [1; -1])) %! assert (isequal (b_out, [0; 2])) %! assert (z_out == 1) %!test % case #7: permutation of #6 %! a = [1; 0; -1]; %! b = [0; 1; 2]; %! [a_out, b_out, z_out] = stk_halfpintl (a, b); %! assert (isequal (a_out, [1; -1])) %! assert (isequal (b_out, [0; 2])) %! assert (z_out == 1) %!test % case #8: another permutation of #6 %! a = [0; 1; -1]; %! b = [1; 0; 2]; %! [a_out, b_out, z_out] = stk_halfpintl (a, b); %! assert (isequal (a_out, [1; -1])) %! assert (isequal (b_out, [0; 2])) %! assert (z_out == 1) %!test % case #9: same as #8, with some duplicated lines added %! a = [0; 1; 0; -1; 0; -1; 1]; %! b = [1; 0; 1; 2; 1; 2; 0]; %! [a_out, b_out, z_out] = stk_halfpintl (a, b); %! assert (isequal (a_out, [1; -1])) %! assert (isequal (b_out, [0; 2])) %! assert (z_out == 1) stk/inst/sampling/stk_sampcrit_akg_eval.m0000644000000000000000000002153113156161544016056 0ustar % STK_SAMPCRIT_AKG_EVAL computes the Approximate KG criterion % % CALL: AKG = stk_sampcrit_akg_eval (ZC_MEAN, ZC_STD, ZR_MEAN, ZR_STD, ZCR_COV) % % computes the value AKG of the Approximate KG criterion for a set of % candidates points, with respect to a certain reference grid. The % predictive distributions of the objective function (to be minimized) at % the candidates and reference points is assumed to be jointly Gaussian, % with mean ZC_MEAN and standard deviation ZC_STD for the candidate points, % mean ZR_MEAN and satandard deviation ZR_STD on the reference points, and % covariance matrix ZCR_COV between the candidate and reference points. % The input argument must have the following sizes: % % * ZC_MEAN M x 1, % * ZC_STD M x 1, % * ZR_MEAN L x 1, % * ZR_STD L x 1, % * ZCR_COV M x L, % % where M is the number of candidate points and L the number of reference % points. The output has size M x 1. % % NOTE ABOUT THE "KNOWLEDGE GRADIENT" CRITERION % % The "Knowlegde Gradient" (KG) criterion is the one-step look-ahead (a.k.a % myopic) sampling criterion associated to the problem of estimating the % minimizer of the objective function under the L^1 loss (equivalently, % under the linear loss/utility). % % This sampling strategy was proposed for the first time in the work of % Mockus and co-authors in the 70's (see [1] and refs therein), for the case % of noiseless evaluations, but only applied to particular Brownian-like % processes for which the minimum of the posterior mean coincides with the % best evaluations so far (in which case the KG criterion coincides with the % EI criterion introduced later by Jones et al [2]). % % It was later discussed for the case of a finite space with independent % Gaussian priors first by Gupta and Miescke [3] and then by Frazier et al % [4] who named it "knowledge gradient". It was extended to the case of % correlated priors by Frazier et al [5]. % % NOTE ABOUT THE REFERENCE SET % % For the case of continuous input spaces, there is no exact expression of % the KG criterion. The approximate KG criterion proposed in this function % is an approximation of the KG criterion where the continuous 'min' in the % expression of the criterion at the i^th candidate point are replaced by % discrete mins over some reference grid *augmented* with the i^th candidate % point. % % This type of approximation has been proposed by Scott et al [6] under the % name "knowledge gradient for continuous parameters" (KGCP). In [6], the % reference grid is composed of the current set of evaluation points. The % implementation proposed in STK leaves this choice to the user. % % Note that, with the reference grid proposed in [6], the complexity of one % evaluation of the AKG (KGCP) criterion increases as O(N log N), where N % denotes the number of evaluation points. % % NOTE ABOUT THE NOISELESS CASE % % Simplified formulas are available for the noiseless case (see [7]) but not % currenly implemented in STK. % % REFERENCES % % [1] J. Mockus, V. Tiesis and A. Zilinskas. The application of Bayesian % methods for seeking the extremum. In L.C.W. Dixon and G.P. Szego, eds, % Towards Global Optimization, 2:117-129, North Holland NY, 1978. % % [2] D. R. Jones, M. Schonlau and William J. Welch. Efficient global % optimization of expensive black-box functions. Journal of Global % Optimization, 13(4):455-492, 1998. % % [3] S. Gupta and K. Miescke, Bayesian look ahead one-stage sampling % allocations for selection of the best population, J. Statist. Plann. % Inference, 54:229-244, 1996. % % [4] P. I. Frazier, W. B. Powell, S. Dayanik, A knowledge gradient policy % for sequential information collection, SIAM J. Control Optim., % 47(5):2410-2439, 2008. % % [5] P. I. Frazier, W. B. Powell, and S. Dayanik. The Knowledge-Gradient % Policy for Correlated Normal Beliefs. INFORMS Journal on Computing % 21(4):599-613, 2009. % % [6] W. Scott, P. I. Frazier and W. B. Powell. The correlated knowledge % gradient for simulation optimization of continuous parameters using % Gaussian process regression. SIAM J. Optim, 21(3):996-1026, 2011. % % [7] J. van der Herten, I. Couckuyt, D. Deschrijver, T. Dhaene, Fast % Calculation of the Knowledge Gradient for Optimization of Deterministic % Engineering Simulations, arXiv preprint arXiv:1608.04550 % % See also: STK_SAMPCRIT_EI_EVAL % Copyright Notice % % Copyright (C) 2017 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function AKG = stk_sampcrit_akg_eval (zc_mean, zc_std, zr_mean, zr_std, zcr_cov) % zc_mean: M x 1 where M is the number of (C)andidate points % zc_std: M x 1 % zr_mean: L x 1 where L is the number of (R)eference points % zr_std: L x 1 % zcr_cov M x L covariance between (C)andidate points and (R)eference points % note: Scott et al.'s "KGCP" corresponds to refs points X_1, ..., X_n if nargin > 5 stk_error ('Too many input arguments.', 'TooManyInputArgs'); end M = size (zc_mean, 1); if ~ isequal (size (zc_mean), [M 1]) stk_error (['zc_mean should have size M x 1, where M is the number of ' ... 'candidate points.'], 'IncorrectSize'); end if ~ isequal (size (zc_std), [M 1]) stk_error (['zc_std should have size M x 1, where M is the number of ' ... 'candidate points.'], 'IncorrectSize'); end L = size (zr_mean, 1); if ~ isequal (size (zr_mean), [L 1]) stk_error (['zr_mean should have size L x 1, where L is the number of ' ... 'reference points.'], 'IncorrectSize'); end if ~ isequal (size (zr_std), [L 1]) stk_error (['zr_std should have size L x 1, where L is the number of ' ... 'reference points.'], 'IncorrectSize'); end if ~ isequal (size (zcr_cov), [M L]) stk_error (['zcr_cov should have size L x 1, where M is the number of ' ... 'candidate points and L the number of reference points.'], ... 'IncorrectSize'); end AKG = zeros (M, 1); % Minimum over the reference grid if isempty (zr_mean) zr_min = +inf; else zr_min = min (zr_mean); end for i = 1:M if zc_std(i) == 0, continue; end % Mitigate the effect of small inaccurate covariance values a0 = zcr_cov(i,:)' / zc_std(i); a0 = max (-zr_std, min (zr_std, a0)); a = [a0; zc_std(i)]; % slopes b = [zr_mean; zc_mean(i)]; % intercepts % Intersection of lower half-planes % (algorithm similar to the one in Scott et al, 2011, Table 4.1, % except that cases of equal slopes are dealt with inside the loop) [a, b, z] = stk_halfpintl (a, b); % Compute normal cdfs and pdfs F = [0; stk_distrib_normal_cdf(z); 1]; p = [0; stk_distrib_normal_pdf(z); 0]; % Compute the expected min (Equation 4.11 in Scott et al, 2011) expected_min = sum (b .* diff (F)) - sum (a .* diff (p)); % Finally, compute the value of the AKG criterion AKG(i) = max (0, min (zr_min, zc_mean(i)) - expected_min); end % for end % function %!shared zc_mean, zc_std, zr_mean, zr_std, zcr_cov, AKG, nc %! xi = [0; 0.2; 0.7; 0.9]; %! zi = [1; 0.9; 0.6; 0.1] - 10; %! ni = 4; %! %! M_prior = stk_model('stk_materncov32_iso'); %! M_prior.param = log ([1.0; 2.1]); %! M_prior.lognoisevariance = 0.678; %! %! nc = 20; %! xc = stk_sampling_regulargrid (nc, 1, [0; 1]); %! [zp, ignd1, ignd2, K] = stk_predict (M_prior, xi, zi, [xi; xc]); % See CG#07 %! %! ir = 1:ni; ic = ni + (1:nc); %! %! zc_mean = zp.mean(ic); %! zc_std = sqrt (zp.var(ic)); %! %! % reference grid: current evaluation points ("KGCP") %! zr_mean = zp.mean(ir); %! zr_std = sqrt (zp.var(ir)); %! %! zcr_cov = K(ic, ir); %!test AKG = stk_sampcrit_akg_eval (zc_mean, zc_std, zr_mean, zr_std, zcr_cov); %!assert (isequal (size (AKG), [nc 1])) %!assert (all (AKG >= 0)) % not enough or too many input args %!error AKG = stk_sampcrit_akg_eval (zc_mean, zc_std, zr_mean, zr_std); %!error AKG = stk_sampcrit_akg_eval (zc_mean, zc_std, zr_mean, zr_std, zcr_cov, 1.234); stk/inst/sampling/stk_sampcrit_ehvi_eval.m0000644000000000000000000001140713156161544016250 0ustar % STK_SAMPCRIT_EHVI_EVAL computes the EHVI criterion % % CALL: EHVI = stk_sampcrit_ehvi_eval (ZP_MEAN, ZP_STD, ZI, ZR) % % computes the value EHVI of the Expected HyperVolume Improvement (EHVI) for % a multi-objective minimization problem, with respect to the observed values % ZI and the reference point ZR, assuming Gaussian predictive distributions % with means ZP_MEAN and standard deviations ZP_STD. The input arguments % must have the following sizes: % % * ZP_MEAN M x P, % * ZP_STD M x P, % * ZI N x P, % * ZR 1 x P, % % where M is the number of points where the EHVI must be computed, P the % number of objective functions to be minimized, and N the current number of % Pareto optimal solutions. The output has size M x 1. % % NOTE % % 1) The result depends only on the non-dominated rows of ZI. % % 2) Multi-objective maximization problems, or mixed minimization/maximization % problems, can be handled by changing the sign of the corresponding % components of ZP_MEAN and ZI. % % REFERENCES % % [1] Emmerich, M. T., Giannakoglou, K. C., & Naujoks, B. Single- and % multiobjective evolutionary optimization assisted by gaussian random % field metamodels. IEEE Transactions on Evolutionary Computation, % 10(4), 421-439, 2006. % % See also: stk_sampcrit_emmi_eval, stk_sampcrit_ei_eval % Copyright Notice % % Copyright (C) 2015, 2017 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function EHVI = stk_sampcrit_ehvi_eval (zp_mean, zp_std, zi, zr) if nargin > 4 stk_error ('Too many input arguments.', 'TooManyInputArgs'); end % EHVI with respect to the reference EIr = stk_distrib_normal_ei (zr, zp_mean, zp_std, 1); % m x p EHVI = prod (EIr, 2); % m x 1 % Compute signed decomposition wrt to the reference zr % (note: stk_dominatedhv removes non-dominated points and duplicates from zi) S = stk_dominatedhv (zi, zr, 1); if ~ isempty (S.sign) % Shift rectangle number to third dimension Rs = shiftdim (S.sign, -2); Ra = shiftdim (S.xmin', -1); Rb = shiftdim (S.xmax', -1); % Number of rectangles R = size (Ra, 3); % Deal with BLOCK_SIZE rectangles at a time to avoid OOM BLOCK_SIZE = ceil (1e7 / (numel (EIr))); nb_blocks = ceil (R / BLOCK_SIZE); r2 = 0; for b = 1:nb_blocks r1 = r2 + 1; r2 = min (r1 + BLOCK_SIZE - 1, R); % Both EIa and EIb will have size m x p x BLOCK_SIZE EIa = stk_distrib_normal_ei (Ra(:, :, r1:r2), zp_mean, zp_std, 1); EIb = stk_distrib_normal_ei (Rb(:, :, r1:r2), zp_mean, zp_std, 1); EHVI = EHVI - sum (bsxfun (@times, ... Rs(:, :, r1:r2), prod (EIb - EIa, 2)), 3); end % if end % if end % function %!shared zr, zi %! zr = [1 1]; %! zi = [0.25 0.75; 0.5 0.5; 0.75 0.25]; %!test % no improvement (1 computation) %! zp_mean = [0.6 0.6]; zp_std = [0 0]; %! EHVI = stk_sampcrit_ehvi_eval (zp_mean, zp_std, zi, zr); %! assert (stk_isequal_tolabs (EHVI, 0, 1e-12)); %!test % guaranteed improvement (1 computation) %! zp_mean = [0 0]; zp_std = [0 0]; %! EHVI = stk_sampcrit_ehvi_eval (zp_mean, zp_std, zi, zr); %! assert (stk_isequal_tolabs (EHVI, 10 * 0.25 ^ 2)); %!test % no improvement again (2 computations) %! zp_mean = [0.5 0.5; 0.6 0.6]; zp_std = [0 0; 0 0]; %! EHVI = stk_sampcrit_ehvi_eval (zp_mean, zp_std, zi, zr); %! assert (stk_isequal_tolabs (EHVI, [0; 0], 1e-12)); %!test % no observation -> EHVI wrt zr %! zp_mean = [0.6 0.6]; zp_std = 0.01 * [1 1]; zi = []; %! EHVI = stk_sampcrit_ehvi_eval (zp_mean, zp_std, zi, zr); %! assert (stk_isequal_tolabs (EHVI, (1 - 0.6)^2, 1e-12)); %!test % no observation below zr -> EHVI wrt zr %! zp_mean = [0.6 0.6]; zp_std = 0.01 * [1 1]; zi = [2 2]; %! EHVI = stk_sampcrit_ehvi_eval (zp_mean, zp_std, zi, zr); %! assert (stk_isequal_tolabs (EHVI, (1 - 0.6)^2, 1e-12)); % FIXME: add MORE unit tests stk/inst/sampling/stk_sampcrit_ei_eval.m0000644000000000000000000000704513156161544015715 0ustar % STK_SAMPCRIT_EI_EVAL computes the EI criterion % % CALL: EI = stk_sampcrit_ei_eval (ZP_MEAN, ZP_STD, ZI) % % computes the value EI of the Expected Improvement (EI) criterion for a % minimization problem, with respect to the observed values ZI, assuming % Gaussian predictive distributions with means ZP_MEAN and standard % deviations ZP_STD. The input argument must have the following sizes: % % * ZP_MEAN M x 1, % * ZP_STD M x 1, % * ZI N x 1, % % where M is the number of points where the EI must be computed, and N the % number of observations. The output has size M x 1. % % REMARK % % Since the EI is computed for a minimization problem, the result depends % on the minimum of the obervations only, not on the entire set of observed % values. The above call is thus equivalent to % % EI = stk_sampcrit_ei_eval (ZP_MEAN, ZP_STD, min (ZI)) % % NOTE % % This function was added in STK 2.4.1, and will in the future completely % replace stk_distrib_normal_ei. Note that, unlike the present function, % stk_distrib_normal_ei returns as a default the EI for a *maximization* % problem. % % REFERENCES % % [1] D. R. Jones, M. Schonlau and William J. Welch. Efficient global % optimization of expensive black-box functions. Journal of Global % Optimization, 13(4):455-492, 1998. % % [2] J. Mockus, V. Tiesis and A. Zilinskas. The application of Bayesian % methods for seeking the extremum. In L.C.W. Dixon and G.P. Szego, % editors, Towards Global Optimization, volume 2, pages 117-129, North % Holland, New York, 1978. % Copyright Notice % % Copyright (C) 2016, 2017 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function EI = stk_sampcrit_ei_eval (zp_mean, zp_std, zi) if nargin > 4 stk_error ('Too many input arguments.', 'TooManyInputArgs'); end % Evaluate the sampling criterion EI = stk_distrib_normal_ei (min (zi), zp_mean, zp_std, true); end % function %!error EI = stk_sampcrit_ei_eval () % not enough args %!error EI = stk_sampcrit_ei_eval (0) % not enough args %!error EI = stk_sampcrit_ei_eval (0, 0, 0, 0, 0) % too many args %% % Compare various ways to compute the EI %!shared xi, zi, M_prior, xt, zp, EIref, EI1, EI2, EI3 %! xi = [0; 0.2; 0.7; 0.9]; %! zi = [1; 0.9; 0.6; 0.1]; %! M_prior = stk_model('stk_materncov32_iso'); %! M_prior.param = log ([1.0; 2.1]); %! xt = stk_sampling_regulargrid (20, 1, [0; 1]); %! zp = stk_predict (M_prior, xi, zi, xt); %! EIref = stk_distrib_normal_ei (min (zi), zp.mean, sqrt (zp.var), true); %!test % Current syntax (STK 2.4.1 and later) %! EI1 = stk_sampcrit_ei_eval (zp.mean, sqrt (zp.var), min (zi)); %!assert (isequal (EI1, EIref)) stk/inst/sampling/stk_sampcrit_emmi_eval.m0000644000000000000000000000742513156161544016251 0ustar % STK_SAMPCRIT_EMMI_EVAL computes the EMMI criterion % % CALL: EMMI = stk_sampcrit_emmi_eval (ZP_MEAN, ZP_STD, ZI) % % computes the value EMMI of the Expected MaxiMin Improvement (EMMI) for a % multi-objective minimization problem, with respect to the observed values % ZI, assuming Gaussian predictive distributions with means ZP_MEAN and % standard deviations ZP_STD. The value of the criterion is computed % approximately, using Monte Carlo simulations. The input arguments must % have the following sizes: % % * ZP_MEAN M x P, % * ZP_STD M x P, % * ZI N x P, % % where M is the number of points where the EMMI must be computed, P the % number of objective functions to be minimized, and N the current number of % Pareto optimal solutions. The output has size M x 1. % % CALL: EMMI = stk_sampcrit_emmi_eval (ZP_MEAN, ZP_STD, ZI, NSIMU) % % allows to change the number of simulations NSIMU used in the calculation of % the criterion. % % NOTE % % 1) The result depends only on the non-dominated rows of ZI. % % 2) Multi-objective maximization problems, or mixed minimization/maximization % problems, can be handled by changing the sign of the corresponding % components of ZP_MEAN and ZI. % % 3) Objective functions should be normalized for better performances. % % REFERENCES % % [1] Svenson J.D. and Santner T.J. Multiobjective optimization of % expensive black-box functions via expected maximin improvement. % Technical report, Tech. rep., 43210, Ohio University, Columbus, % Ohio, 2010 % % See also: stk_sampcrit_ehvi_eval % Copyright Notice % % Copyright (C) 2017 CentraleSupelec % Copyright (C) 2016 IRT SystemX % % Author: Paul Feliot % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function EMMI = stk_sampcrit_emmi_eval (zp_mean, zp_std, zi, nsimu) if nargin > 4, stk_error ('Too many input arguments.', 'TooManyInputArgs'); end % Handle empty zp if isempty (zp_mean) || isempty (zp_std) EMMI = []; return end % Handle empty zi if isempty (zi) stk_error ('Empty zi.', 'EmptyZi') else zi = double (zi); % Keep only non-dominated points, and remove duplicates zi = unique (zi(stk_paretofind (zi), :), 'rows'); end % Size parameters n = size (zp_mean, 1); [np, p] = size(zi); % Number of simulation not provided: Defaults to nsimu = 200 x p if nargin == 3 nsimu = 200 * p; end % The criterion is calculated using Monte Carlo simulation EMMI = zeros (n, 1); for i = 1:n % Simulate normal distribution simu = bsxfun (@plus, zp_mean(i,1:p), ... bsxfun (@times, zp_std(i,1:p), randn (nsimu, p))); % Compute maximin improvement maximin = min (bsxfun(@minus, simu, zi(1,:)), [], 2); for k = 2:np maximin = max (maximin, min (bsxfun(@minus, simu, zi(k,:)), [], 2)); end isdom = stk_isdominated (simu, zi); improvement = - maximin .* ~isdom; % Approximate expectation EMMI(i) = 1/nsimu * sum (improvement); end end % function stk/inst/sampling/stk_sampling_halton_rr2.m0000644000000000000000000000735313156161544016355 0ustar % STK_SAMPLING_HALTON_RR2 generates points from the Halton/RR2 sequence % % CALL: X = stk_sampling_halton_rr2 (N, D) % % computes the first N terms of the D-dimensional RR2-scrambled Halton % sequence. % % REFERENCE % % Ladislav Kocis and William J. Whiten, "Computational investigations of low % discrepancy sequences", ACM Transactions on Mathematical Software, % 23(2):266-294, 1997. http://dx.doi.org/10.1145/264029.264064 % % SEE ALSO: __stk_sampling_vdc_rr2__ % Copyright Notice % % Copyright (C) 2017 CentraleSupelec % Copyright (C) 2014 SUPELEC % Copyright (C) 2013 Alexandra Krauth, Elham Rahali & SUPELEC % % Authors: Julien Bect % Alexandra Krauth % Elham Rahali % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function x = stk_sampling_halton_rr2 (n, d, box) if nargin > 3, stk_error ('Too many input arguments.', 'TooManyInputArgs'); end % Read argument dim if (nargin < 2) || ((nargin < 3) && (isempty (d))) d = 1; % Default dimension elseif (nargin > 2) && (~ isempty (box)) d = size (box, 2); end % Read argument 'box' if (nargin < 3) || isempty (box) colnames = {}; else box = stk_hrect (box); % convert input argument to a proper box colnames = box.colnames; end xdata = zeros (n, d); for j = 1:d, xdata(:, j) = double (__stk_sampling_vdc_rr2__ (n, j)); end x = stk_dataframe (xdata, colnames); if nargin > 2, x = stk_rescale (x, [], box); end end % function %!error stk_sampling_halton_rr2 () % nargin < 1 %!error stk_sampling_halton_rr2 (10, 3, [], -1) % nargin > 3 %!test %! n = 300; d = 25; %! x = stk_sampling_halton_rr2 (n, d); %! assert (isequal (size (x), [n d])) %!test %! x = stk_sampling_halton_rr2 (1000, 3); %! y = double (x(end, :)); %! yref = [0.9052734375 0.028349336991312 0.74848]; %! assert (stk_isequal_tolrel (y, yref, 1e-13)); %% % Check that column names are properly set, if available in box %!test %! dim = 2; box = stk_hrect (dim); %! x = stk_sampling_halton_rr2 (5, dim, box); %! assert (isequal (x.colnames, {})); %!test %! dim = 2; cn = {'W', 'H'}; box = stk_hrect (dim, cn); %! x = stk_sampling_halton_rr2 (5, dim, box); %! assert (isequal (x.colnames, cn)); %% % Comparison with Scilab+lowdisc % % Matlab/Octave STK test script % % NREP = 10; % M = 1e5; % DIM = 20; % % tic; % for i = 1:NREP % x = stk_sampling_halton_rr2(M, DIM); % end; % t1 = toc/NREP; % fprintf('time elapsed: %.2e seconds\n', t1); % % fprintf('%.15f\n', x(1:5, 2)) % // Scilab lowdisc test script % % NREP = 10; % M = 1e5; % DIM = 20; % % tic(); % for i = 1:NREP, % rng = lowdisc_new("halton"); % rng = lowdisc_configure(rng, "-dimension", DIM); % rng = lowdisc_configure(rng, "-scrambling", "RR2"); % rng = lowdisc_startup(rng); % [rng, x] = lowdisc_next(rng, M); % rng = lowdisc_destroy(rng); % end % t = toc() / NREP % % mprintf('%.15f\n', x(1:9, 2)) stk/inst/sampling/stk_sampling_maximinlhs.m0000644000000000000000000001062213156161544016445 0ustar % STK_SAMPLING_MAXIMINLHS generates a "maximin" LHS design % % CALL: X = stk_sampling_maximinlhs (N, DIM) % % generates a "maximin" Latin Hypercube Sample of size N in the % DIM-dimensional hypercube [0; 1]^DIM. More precisely, NITER = 1000 % independent random LHS are generated, and the one with the biggest % separation distance is returned. % % CALL: X = stk_sampling_maximinlhs (N, DIM, BOX) % % does the same thing in the DIM-dimensional hyperrectangle specified by the % argument BOX, which is a 2 x DIM matrix where BOX(1, j) and BOX(2, j) are % the lower- and upper-bound of the interval on the j^th coordinate. % % CALL: X = stk_sampling_maximinlhs (N, DIM, BOX, NITER) % % allows to change the number of independent random LHS that are used. % % See also: stk_mindist, stk_sampling_randomlhs % Copyright Notice % % Copyright (C) 2017 CentraleSupelec % Copyright (C) 2011-2014 SUPELEC % % Authors: Julien Bect % Emmanuel Vazquez % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function x = stk_sampling_maximinlhs (n, d, box, niter) if nargin > 4, stk_error ('Too many input arguments.', 'TooManyInputArgs'); end % Read argument dim if (nargin < 2) || ((nargin < 3) && (isempty (d))) d = 1; % Default dimension elseif (nargin > 2) && (~ isempty (box)) d = size (box, 2); end % Read argument 'box' if (nargin < 3) || isempty (box) box = stk_hrect (d); % build a default box else box = stk_hrect (box); % convert input argument to a proper box end if nargin < 4, niter = 1000; end if n == 0, % no input => no output xdata = zeros (0, d); else % at least one input point xx = lhsdesign_ (n, d, niter); xdata = stk_rescale (xx, [], box); end x = stk_dataframe (xdata, box.colnames); end % function %%%%%%%%%%%%%%%%%% %%% lhsdesign_ %%% %%%%%%%%%%%%%%%%%% function x = lhsdesign_ (n, d, niter) x = generatedesign_ (n, d); if niter > 1, bestscore = stk_mindist (x); for j = 2:niter y = generatedesign_ (n, d); score = stk_mindist (y); if score > bestscore x = y; bestscore = score; end end end end % function %%%%%%%%%%%%%%%%%%%%%%% %%% generatedesign_ %%% %%%%%%%%%%%%%%%%%%%%%%% function x = generatedesign_ (n, d) x = zeros (n, d); for i = 1:d % for each dimension, draw a random permutation [ignd, x(:,i)] = sort (rand (n,1)); %#ok CG#07 end x = (x - rand (size (x))) / n; end % function %% % Check error for incorrect number of input arguments %!shared x, n, dim, box, niter %! n = 20; dim = 2; box = [0, 0; 1, 1]; niter = 1; %!error x = stk_sampling_maximinlhs (); %!test x = stk_sampling_maximinlhs (n); %!test x = stk_sampling_maximinlhs (n, dim); %!test x = stk_sampling_maximinlhs (n, dim, box); %!test x = stk_sampling_maximinlhs (n, dim, box, niter); %!error x = stk_sampling_maximinlhs (n, dim, box, niter, pi); %% % Check that the output is a dataframe % (all stk_sampling_* functions should behave similarly in this respect) %!assert (isa (x, 'stk_dataframe')); %% % Check that column names are properly set, if available in box %!assert (isequal (x.colnames, {})); %!test %! cn = {'W', 'H'}; box = stk_hrect (box, cn); %! x = stk_sampling_maximinlhs (n, dim, box); %! assert (isequal (x.colnames, cn)); %% % Check output argument %!test %! for dim = 1:5, %! x = stk_sampling_randomlhs (n, dim); %! assert (isequal (size (x), [n dim])); %! u = double (x); u = u(:); %! assert (~ any (isnan (u) | isinf (u))); %! assert ((min (u) >= 0) && (max (u) <= 1)); %! assert (stk_is_lhs (x, n, dim)); %! end stk/inst/sampling/stk_sampling_nesteddesign.m0000644000000000000000000001632713156161544016760 0ustar % STK_SAMPLING_NESTEDDESIGN generates a nested design % % CALL: X = stk_sampling_nesteddesign (N, DIM) % % generates a nested design with length(N) levels, with N(k) points at % the k-th level. X has sum(N) rows and (DIM + 1) columns, the last % column begin the levels. % A design is nested when all points at the (k+1)-th level are also at % the k-th level. % % CALL: X = stk_sampling_nesteddesign (N, DIM, BOX) % % does the same thing in the DIM-dimensional hyperrectangle specified by the % argument BOX, which is a 2 x DIM matrix where BOX(1, j) and BOX(2, j) are % the lower- and upper-bound of the interval on the j^th coordinate. % Default value for BOX: [0; 1]^DIM. % If BOX is provided, DIM = size(BOX, 2). % Warning: size(X, 2) == (DIM + 1) % % CALL: X = stk_sampling_nesteddesign (N, DIM, BOX, NITER) % % allows to change the number of independent random LHS that are used, % when generating a maximin LHS. % Default value for NITER: 1000. % % CALL: X = stk_sampling_nesteddesign (N, DIM, BOX, NITER, LEVELS) % % does the same thing, but the levels are indexed by the vector LEVELS. % The length of LEVELS must be greater or equal than the length of N. % Default value for levels: 1:length(N). % % EXAMPLE % % n = [30, 14, 5, 2]; dim = 2; % bnd = stk_hrect([-5, 1; 7, 2]); % levels = [100; 50; 33; 25; 20;]; % x = stk_sampling_nesteddesign(n, dim, bnd, [], levels); % % REFERENCE % % [1] Loic Le Gratiet, "Multi-fidelity Gaussian process regression for % computer experiments", PhD thesis, Universite Paris-Diderot - % Paris VII, 2013. % % See also: stk_sampling_nestedlhs, stk_sampling_maximinlhs % Copyright Notice % % Copyright (C) 2017 LNE % Copyright (C) 2017 CentraleSupelec % % Authors: Remi Stroh % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function nested_design = stk_sampling_nesteddesign(n, dim, box, niter, levels) if nargin > 5, stk_error ('Too many input arguments.', 'TooManyInputArgs'); end if nargin < 1, stk_error ('Not enough input arguments.', 'NotEnoughInputArgs'); end %% Read the input arguments % number of points n = n(:); if any(n <= 0) stk_error('Number of points at each level must be strictly positive.',... 'InvalidArgument'); end nLev = length(n); % Read argument dim if (nargin > 2) && (~ isempty (box)) dim = size (box, 2); elseif (nargin < 2) || (isempty (dim)) dim = 1; % Default dimension end % Read argument box if (nargin < 3) || isempty (box) box = stk_hrect (dim); else % Check that box is a box if ~ isa (box, 'stk_hrect') box = stk_hrect (box); end end % niter, number of interation if (nargin < 4) || isempty(niter) niter = 1000; end % Read argument levels level_name = 'Level'; % Column name of the column level if (nargin < 5) || isempty (levels) levels = (1:nLev)'; else % Find the colnames of the levels if isa(levels, 'stk_dataframe') % If isa data frame with a non-empty colname, return the first % non-empty colnames empty_colnames = ~cellfun(@isempty, levels.colnames); if any(empty_colnames) level_name = levels.colnames{find(empty_colnames, 1)}; end end % Assert vector levels = double(levels(:)); % Assert unique values of levels if ~isequal(unique(levels), sort(levels)) stk_error('Levels are not unique.', 'InvalidArgument') end % Check number of proposed levels if length(levels) < nLev stk_error('You do not have enough levels, or the array ''n'' is too long.',... 'InvalidArgument'); end levels = levels(1:nLev); end %% Nested design best_design = NaN(n(1), dim); row_highLevels = @(M, k, numb)(numb(M) - ( (numb(k) - 1):-1:0)); row_currentLevel = @(M, k, numb)(numb(M) - ( (numb(k) - 1):-1:numb(k + 1)) ); % k_lev = nLev best_design(row_highLevels(1, nLev, n), :) = ... double( stk_sampling_maximinlhs(n(nLev), dim, box, niter) ); for k_lev = (nLev - 1):-1:1 % 1: Generate a LHS design X_new_k = stk_sampling_maximinlhs(n(k_lev), dim, box, niter); % 2: Compute minimal distance between any proposed points, and points % already in the design X_prev = best_design(row_highLevels(1, k_lev + 1, n), :); dist_new_prev = min( stk_dist(X_new_k, X_prev), [], 2); % 3: Keep the farthest [ignd, ind_dist] = sort(dist_new_prev, 'descend'); %#ok CG#07 ind_select = ind_dist( 1:((n(k_lev) - n(k_lev + 1)) ), 1); best_design(row_currentLevel(1, k_lev, n), :) = double( X_new_k(ind_select, :) ); end %% Create a nested design nested_design = NaN(sum(n), dim + 1); % The total number of points in the nested design nCumNb = [0; cumsum(n)]; % Add points + the corresponding level for knL = 1:nLev nested_design((nCumNb(knL) + 1):(nCumNb(knL + 1)), :) = [ best_design(row_highLevels(1, knL, n), :), repmat(levels(knL), n(knL), 1)]; end % Add columns names colnames = cell(1, dim + 1); if ~isempty(box.colnames) colnames(1, 1:dim) = box.colnames; end colnames{1, dim + 1} = level_name; % Return a nested design nested_design = stk_dataframe(nested_design, colnames); end % Check error for incorrect number of input arguments %!shared x, n, dim, box, niter, levels %! n = [23; 14; 5; 2]; dim = 2; box = [0, 0; 4, 4]; niter = 10; %! levels = [10.1; 15.2; -9.3; 2.4; 17.5]; %!error x = stk_sampling_nesteddesign (); %!test x = stk_sampling_nesteddesign (n); %!test x = stk_sampling_nesteddesign (n, dim); %!test x = stk_sampling_nesteddesign (n, dim, box); %!test x = stk_sampling_nesteddesign (n, dim, box, niter); %!test x = stk_sampling_nesteddesign (n, dim, box, niter, levels); %!error x = stk_sampling_nesteddesign (n, dim, box, niter, levels, pi); % Check type of ouputs => assert is Nested Design %!assert ( isequal(size(x), [sum(n), dim + 1]) ); %!assert ( isa(x, 'stk_dataframe') ); %! cn = [0; cumsum(n)]; %! for lev = 1:length(n), %! y = x( (cn(lev) + 1):(cn(lev + 1)), 1:dim ); %! assert (isequal (size (y), [n(lev) dim])); %! if lev > 1 %! assert ( isequal(z((end - n(lev) + 1):end, :), y) ); %! end %! if lev == length(n) %! assert (stk_is_lhs (y, n(lev), dim, box)); %! end %! z = y; %! end % Check column names %!assert (isequal (x.colnames{dim + 1}, 'Level')); %! levels = stk_dataframe(levels, {'t'}); %! box = stk_hrect(box, {'x1', 'x2', 'x3', 'x4'}); %!test x = stk_sampling_nesteddesign (n, [], box, [], levels); %!assert (isequal(x.colnames, {'x1', 'x2', 'x3', 'x4', 't'}) );stk/inst/sampling/stk_sampling_nestedlhs.m0000644000000000000000000002232213156161544016265 0ustar % STK_SAMPLING_NESTEDLHS builds a Nested Latin Hypercube Sampling (NLHS) % % CALL: X = stk_sampling_nestedlhs (N, DIM) % % builds a NLHS, with length(N) levels, N(k) points at the k-th level, % and a dimension DIM. X has sum(N) rows and (DIM + 1) columns, the last % column begin the levels. % A design is nested when all points observed at the (k+1)-th level are % also observed at the k-th level. % A nested design is a Latin Hypercube Sampling (LHS), if every % sub-design corresponding to a specified level is a LHS. % Remark: N(k) must divide N(k + 1). % % CALL: X = stk_sampling_nestedlhs (N, DIM, BOX) % % does the same thing in the DIM-dimensional hyperrectangle specified by the % argument BOX, which is a 2 x DIM matrix where BOX(1, j) and BOX(2, j) are % the lower- and upper-bound of the interval on the j^th coordinate. % Default value for BOX: [0; 1]^DIM. % If BOX is provided, DIM = size(BOX, 2). % Warning: size(X, 2) == (DIM + 1) % % CALL: X = stk_sampling_nestedlhs (N, DIM, BOX, NITER) % % allows to change the number of independent random LHS that are used at % each level to complete the design. % Default value for NITER: 1000. % Put NITER to 1 to generate a random NLHS. % % CALL: X = stk_sampling_nestedlhs (N, DIM, BOX, NITER, LEVELS) % % does the same thing, but the levels are indexed by the vector LEVELS. % The length of LEVELS must be greater or equal than the length of N. % Default value for LEVELS: 1:length(N). % % EXAMPLE % % n = [48, 12, 6, 2]; dim = 2; % bnd = stk_hrect([-5, 1; 7, 2]); % levels = [100; 50; 33; 25; 20;]; % x = stk_sampling_nestedlhs(n, dim, bnd, [], levels); % % REFERENCE % % [1] Peter Z. G. Qian, "Nested latin hypercube designs", Biometrika, % 96(4):957-970, 2009. % % See also: stk_sampling_nesteddesign, stk_sampling_randomlhs % Copyright Notice % % Copyright (C) 2017 LNE % Copyright (C) 2017 CentraleSupelec % % Authors: Remi Stroh % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function nested_LHS = stk_sampling_nestedlhs(n, dim, box, niter, levels) if nargin > 5, stk_error ('Too many input arguments.', 'TooManyInputArgs'); end if nargin < 1, stk_error ('Not enough input arguments.', 'NotEnoughInputArgs'); end %% Read input arguments % number of points n = n(:); % assert vector if any(n <= 0) stk_error('Number of points at each level must be strictly positive.',... 'InvalidArgument'); end nLev = length(n); % Read argument dim if (nargin > 2) && (~ isempty (box)) dim = size (box, 2); elseif (nargin < 2) || (isempty (dim)) dim = 1; % Default dimension end % Read argument box if (nargin < 3) || isempty (box) box = stk_hrect (dim); else % Check that box is a box if ~ isa (box, 'stk_hrect') box = stk_hrect (box); end end % niter, number of interation if (nargin < 4) || isempty(niter) niter = 1000; end % Read argument levels level_name = 'Level'; % Column name of the column level if (nargin < 5) || isempty (levels) levels = (1:nLev)'; else % Find the colnames of the levels if isa(levels, 'stk_dataframe') % If isa data frame with a non-empty colname, return the first % non-empty colnames empty_colnames = ~cellfun(@isempty, levels.colnames); if any(empty_colnames) level_name = levels.colnames{find(empty_colnames, 1)}; end end % Assert vector levels = double(levels(:)); % Assert unique values of levels if ~isequal(unique(levels), sort(levels)) stk_error('Levels are not unique.', 'InvalidArgument') end % Check number of proposed levels if length(levels) < nLev stk_error('You do not have enough levels, or the array ''n'' is too long.',... 'InvalidArgument'); end levels = levels(1:nLev); end %% Quotient between each level quotient = floor(n(1:(nLev - 1))./n(2:nLev)); remainder = n(1:(nLev - 1)) - quotient.*n(2:nLev); if any( remainder ~= 0 ) %assert n(2)|n(1); n(3)|n(2); n(4)|n(3); etc, ... stk_error(['This method supposes that the number of points',... ' at level t + 1 divides the number of points at level t.'],... 'InvalidArgument'); end %% Build the nested design % Nested Latin hypercube designs % BY PETER Z. G. QIAN, 2009 best_LHS = NaN(n(1), dim); X_prev = NaN(0, dim); % at the beginning there is not any point n = [n; 0]; % no point are asked at the level nLev + 1 quotient = [1; quotient]; % no multiplication at the first level % Two functions to find points of a level row_highLevels = @(M, k, numb)(numb(M) - ( (numb(k) - 1):-1:0)); row_currentLevel = @(M, k, numb)(numb(M) - ( (numb(k) - 1):-1:numb(k + 1)) ); for k_lev = nLev:-1:1; %begin by the end list_nb = (1:n(k_lev))'; % list of all values we must get after this loop n_new_k = n(k_lev) - n(k_lev + 1); % number of new value to add list_nb_new_k = NaN(n_new_k, dim); for id = 1:dim list_nb_new_k(:, id) = list_nb(~ismember(list_nb, X_prev(:, id)), 1); % Find every element in the complete list of number, which are not % chosen in the previous level end best_score = -Inf; for k_try = 1:niter X_new_kl = NaN(n_new_k, dim); %the matrix to add [ignd, random_index] = sort(rand(n_new_k, dim), 1); %#ok CG#07 for i = 1:dim X_new_kl(:, i) = list_nb_new_k(random_index(:, i), i); end LHS_cand_kl = NaN(n(k_lev), dim); LHS_cand_kl(row_highLevels(k_lev, k_lev + 1, n), :) = X_prev; LHS_cand_kl(row_currentLevel(k_lev, k_lev, n) , :) = X_new_kl; % add new results (only observed at this level, and not any higher) % to previous results (corresponding to point observed at higher levels, % and so, at this level too) % Random moves LHS_cand_kl = LHS_cand_kl - rand(n(k_lev), dim); % Extend on a larger space for next loop LHS_cand_kl = ceil(quotient(k_lev)*LHS_cand_kl); if n(k_lev) > 1 && niter > 1 score = stk_mindist(LHS_cand_kl); else % particular case where n(kl) == 1 (no distance) score = 0; end if score > best_score % Save the best design in the lhs. best_score = score; best_LHS = LHS_cand_kl; end end % end k_try % For the next loop, get the points of the previous levels X_prev = best_LHS; end % Remove the 0 from the end n = n(1:nLev); % Random move + scaling in [0; 1] best_LHS = (best_LHS - rand(n(1), dim))/n(1); % Rescale in box best_LHS = stk_rescale(best_LHS, [], box); %% Create a nested design nested_LHS = NaN(sum(n), dim + 1); % The total number of points in the LHS design nCumNb = [0; cumsum(n)]; % Add points + the corresponding level for knL = 1:nLev nested_LHS((nCumNb(knL) + 1):(nCumNb(knL + 1)), :) = [ best_LHS(row_highLevels(1, knL, n), :), repmat(levels(knL), n(knL), 1)]; end % Add columns names colnames = cell(1, dim + 1); if ~isempty(box.colnames) colnames(1, 1:dim) = box.colnames; end colnames{1, dim + 1} = level_name; % Return a nested LHS nested_LHS = stk_dataframe(nested_LHS, colnames); end % Check error for incorrect number of input arguments %!shared x, n, dim, box, niter, levels %! n = [48; 12; 4; 2]; dim = 2; box = [0, 0; 4, 4]; niter = 10; %! levels = [10.1; 15.2; -9.3; 2.4; 17.5]; %!error x = stk_sampling_nestedlhs (); %!test x = stk_sampling_nestedlhs (n); %!test x = stk_sampling_nestedlhs (n, dim); %!test x = stk_sampling_nestedlhs (n, dim, box); %!test x = stk_sampling_nestedlhs (n, dim, box, niter); %!test x = stk_sampling_nestedlhs (n, dim, box, niter, levels); %!error x = stk_sampling_nestedlhs (n, dim, box, niter, levels, pi); % Check type of ouputs => assert is Nested LHS %!assert ( isequal(size(x), [sum(n), dim + 1]) ); %!assert ( isa(x, 'stk_dataframe') ); %! cn = [0; cumsum(n)]; %! for lev = 1:length(n), %! y = x( (cn(lev) + 1):(cn(lev + 1)), 1:dim ); %! assert (isequal (size (y), [n(lev) dim])); %! assert (stk_is_lhs (y, n(lev), dim, box)); %! if lev > 1 %! assert ( isequal(z((end - n(lev) + 1):end, :), y) ); %! end %! z = y; %! end % Check column names %!assert (isequal (x.colnames{dim + 1}, 'Level')); %! levels = stk_dataframe(levels, {'t'}); %! box = stk_hrect(box, {'x1', 'x2', 'x3', 'x4'}); %!test x = stk_sampling_nestedlhs (n, [], box, [], levels); %!assert (isequal(x.colnames, {'x1', 'x2', 'x3', 'x4', 't'}) );stk/inst/sampling/stk_sampling_olhs.m0000644000000000000000000001771313156161544015251 0ustar % STK_SAMPLING_OLHS generates a random Orthogonal Latin Hypercube (OLH) sample % % CALL: X = stk_sampling_olhs (N) % % generates a random Orthogonal Latin Hypercube (OLH) sample X, using the % construction of Ye (1998). The algorithm only works for sample sizes N % of the form 2^(R+1)+1, with R >= 1. Trying to generate an OLHS with a % value of N that is not of this form generates an error. The number of % factors is D = 2*R, and the OLHS is defined on [-1; 1]^D. % % CALL: X = stk_sampling_olhs (N, D) % % does exactly the same thing, provided that there exists an integer R % such that N = 2^(R+1)+1 and D = 2*R (or D is empty). % % CALL: X = stk_sampling_olhs (N, D, BOX) % % generates an OLHS on BOX. Again, D can be empty since the number of % factors can be deduced from N. % % CALL: X = stk_sampling_olhs (N, D, BOX, PERMUT) % % uses a given permutation PERMUT, instead of a random permutation, to % initialize the construction of Ye (1998). As a result, the generated % OLHS is not random anymore. PERMUT must be a permutation of 1:2^R. If % BOX is empty, then the default domain [-1, 1]^D is used. % % NOTE: orthogonality % % The samples generated by this functions are only orthogonal, stricty- % speaking, if BOX is a symmetric domain (e.g., [-1, 1] ^ D). Otherwise, % the generated samples should be called "uncorrelated". % % REFERENCE % % Kenny Q. Ye, "Orthogonal Column Latin Hypercubes and Their % Application in Computer Experiments", Journal of the American % Statistical Association, 93(444), 1430-1439, 1998. % http://dx.doi.org/10.1080/01621459.1998.10473803 % % See also: stk_sampling_randomlhs, stk_sampling_maximinlhs % Copyright Notice % % Copyright (C) 2017 CentraleSupelec % Copyright (C) 2012-2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function [x, aux] = stk_sampling_olhs (n, d, box, permut, extended) if nargin > 5, stk_error ('Too many input arguments.', 'TooManyInputArgs'); end % Read argument dim if (nargin < 2) || ((nargin < 3) && (isempty (d))) d = 1; % Default dimension elseif (nargin > 2) && (~ isempty (box)) d = size (box, 2); end if nargin < 5, extended = false; end %%% PROCESS INPUT ARGUMENTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % recover the "order" r from the value of n r = floor(log2(n - 1) - 1); n_ = 2^(r + 1) + 1; if (r <= 0) || (abs(n - n_) > eps), errmsg = 'n must be an integer of the form 2^(r+1) + 1 with r > 0'; stk_error(errmsg, 'InvalidArgument'); end n = n_; if ~extended % check that d has the correct value for a "full" Ye98-OLHS % (other values of d can be reached by removing columns from a full OLHS) if (nargin > 1) && ~isempty(d), if d ~= 2 * r, errmsg = 'Incorrect value of d, please read the documentation...'; stk_error(errmsg, 'InvalidArgument'); end else d = 2 * r; end else % check that d has the correct value for a "full" Cioppa-Lucas(2007) NOLHS % (other values of d can be reached by removing columns from a full NOLHS) if (nargin > 1) && ~isempty(d), if d ~= r + 1 + nchoosek(r, 2), errmsg = 'Incorrect value of d, please read the documentation...'; stk_error(errmsg, 'InvalidArgument'); end else d = r + 1 + nchoosek(r, 2); end end % number of "positive levels" q = 2^r; % = (n - 1)/2 % read argument 'box' if (nargin < 3) || isempty (box) box = stk_hrect (repmat ([-1; 1], 1, d)); % build a default box else box = stk_hrect (box); % convert input argument to a proper box end % permutation if (nargin < 4) || isempty(permut), permut = randperm(q)'; else permut = permut(:); if ~isequal(sort(permut), (1:q)'), errmsg = sprintf('permut should be a permutation of 1:%d.', q); stk_error(errmsg, 'InvalidArgument'); end end %%% CONSTRUCT AN "ORTHOGONAL" LHS FOLLOWING PROCESS INPUT ARGUMENTS %%%%%%%%%%% % Construct permutation matrices A1, A2, ..., Ar A = cell(1, r); for i = 1:r, Ai = 1; for j = 1:i, Z = zeros(size(Ai)); Ai = [Z Ai; Ai Z]; %#ok end for j = (i+1):r, Z = zeros(size(Ai)); Ai = [Ai Z; Z Ai]; %#ok end A{i} = Ai; end % Construct the matrix M M = [permut zeros(q, 2*r-1)]; for j = 1:r, % from column 2 to column r+1 M(:, j+1) = A{j} * permut; end if ~extended, % OLHS / Ye (1998) for j = 1:(r-1), % from column r+2 to column 2*r M(:, j+r+1) = A{j} * A{r} * permut; end else % NOLHS / Cioppa & Lucas(2007) col = r + 2; for j = 1:(r-1), for k = (j + 1):r, M(:, col) = A{j} * A{k} * permut; col = col + 1; end end end % Construct the matrix S S = ones(q, 2*r); for j = 1:r, % from column 2 to column r+1 aj = 1; for l = r:(-1):1, if l == r - j + 1, aj = [-aj; aj]; %#ok else aj = [aj; aj]; %#ok end end S(:, j+1) = aj; end if ~extended, % OLHS / Ye (1998) for j = 1:(r-1), % from column r+2 to column 2*r S(:, r+1+j) = S(:, 2) .* S(:, j+2); end else % NOLHS / Cioppa & Lucas(2007) col = r + 2; for j = 1:(r - 1), for k = (j + 1):r, S(:, col) = S(:, j+1) .* S(:, k+1); col = col + 1; end end end % Construct the matrix T T = M .* S; % Construct the OLHS X (with integer levels -q, ..., 0, ... +q) x_integer_levels = [T; zeros(1, d); -T]; %%% CONVERT TO THE REQUESTED BOX %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Convert to positive integer levels (1 ... n) x = x_integer_levels + q + 1; % Convert to [0; 1]-valued levels x = (2*x - 1) / (2*n); % And, finally, convert to box x = stk_dataframe (stk_rescale (x, [], box), box.colnames); % Note: the results reported in Cioppa & Lucas correspond to the scaling % x = struct('a', stk_rescale(x, [min(x); max(x)], box)); %%% OUTPUT SOME AUXILIARY DATA IF REQUESTED %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% if nargout > 1, aux = struct('M', M, 'S', S, 'X', x_integer_levels); end end % function %% % Check error for incorrect number of input arguments %!shared x, n, d, box, permut %! n = 5; d = 2; box = [0 0; 1, 1]; permut = 1:2; %!error x = stk_sampling_olhs(); %!test x = stk_sampling_olhs(n); %!test x = stk_sampling_olhs(n, d); %!test x = stk_sampling_olhs(n, d, box); %!test x = stk_sampling_olhs(n, d, box, permut); %!error x = stk_sampling_olhs(n, d, box, permut, pi); %% % Check that the output is a dataframe % (all stk_sampling_* functions should behave similarly in this respect) %!assert (isa (x, 'stk_dataframe')); %% % Check that column names are properly set, if available in box %!assert (isequal (x.colnames, {})); %!test %! cn = {'W', 'H'}; box = stk_hrect (box, cn); %! x = stk_sampling_olhs (n, d, box); %! assert (isequal (x.colnames, cn)); %% % Check output argument %!test %! for r = 1:5 %! %! n = 2 ^ (r + 1) + 1; d = 2 * r; %! x = stk_sampling_olhs (n, d); %! %! assert (isequal (size (x), [n d])); %! %! box = repmat ([-1; 1], 1, d); %! assert (stk_is_lhs (x, n, d, box)); %! %! x = double (x); w = x' * x; %! assert (stk_isequal_tolabs (w / w(1,1), eye (d))); %! %! end stk/inst/sampling/stk_sampling_randomlhs.m0000644000000000000000000000615713156161544016273 0ustar % STK_SAMPLING_RANDOMLHS generates a random LHS design % % CALL: X = stk_sampling_randomlhs (N, DIM) % % generates a random Latin Hypercube Sample of size N in the DIM-dimensional % hypercube [0; 1]^DIM. % % CALL: X = stk_sampling_randomlhs (N, DIM, BOX) % % generates a random Latin Hypercube Sample of size N in the DIM-dimensional % hyperrectangle specified by the argument BOX, which is a 2 x DIM matrix % where BOX(1, j) and BOX(2, j) are the lower- and upper-bound of the interval % on the j^th coordinate. % % See also: stk_sampling_maximinlhs, stk_sampling_randunif % Copyright Notice % % Copyright (C) 2017 CentraleSupelec % Copyright (C) 2011-2014 SUPELEC % % Authors: Julien Bect % Emmanuel Vazquez % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function x = stk_sampling_randomlhs (n, dim, box) if nargin > 3, stk_error ('Too many input arguments.', 'TooManyInputArgs'); end % Read argument dim if (nargin < 2) || ((nargin < 3) && (isempty (dim))) dim = 1; % Default dimension elseif (nargin > 2) && (~ isempty (box)) dim = size (box, 2); end % Read argument box if (nargin < 3) || isempty (box) box = stk_hrect (dim); end niter = 1; x = stk_sampling_maximinlhs (n, dim, box, niter); end % function %% % Check error for incorrect number of input arguments %!shared x, n, dim, box %! n = 10; dim = 2; box = [0, 0; 1, 1]; %!error x = stk_sampling_randomlhs (); %!test x = stk_sampling_randomlhs (n); %!test x = stk_sampling_randomlhs (n, dim); %!test x = stk_sampling_randomlhs (n, dim, box); %!error x = stk_sampling_randomlhs (n, dim, box, pi); %% % Check that the output is a dataframe % (all stk_sampling_* functions should behave similarly in this respect) %!assert (isa(x, 'stk_dataframe')); %% % Check that column names are properly set, if available in box %!assert (isequal (x.colnames, {})); %!test %! cn = {'W', 'H'}; box = stk_hrect (box, cn); %! x = stk_sampling_randomlhs (n, dim, box); %! assert (isequal (x.colnames, cn)); %% % Check output argument %!test %! for dim = 1:5, %! x = stk_sampling_randomlhs(n, dim); %! assert(isequal(size(x), [n dim])); %! u = double(x); u = u(:); %! assert(~any(isnan(u) | isinf(u))); %! assert((min(u) >= 0) && (max(u) <= 1)); %! assert(stk_is_lhs(x, n, dim)); %! end stk/inst/sampling/stk_sampling_randunif.m0000644000000000000000000000713513156161544016107 0ustar % STK_SAMPLING_RANDUNIF generates uniformly distributed points % % CALL: X = stk_sampling_randunif (N, DIM) % % generates N points, independent and uniformly distributed in the % DIM-dimensional hypercube [0; 1]^DIM. % % CALL: X = stk_sampling_randunif (N, DIM, BOX) % % does the same thing in the DIM-dimensional hyperrectangle specified by the % argument BOX, which is a 2 x DIM matrix where BOX(1, j) and BOX(2, j) are % the lower- and upper-bound of the interval on the j^th coordinate. % Copyright Notice % % Copyright (C) 2017 CentraleSupelec % Copyright (C) 2011-2014 SUPELEC % % Authors: Julien Bect % Emmanuel Vazquez % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function x = stk_sampling_randunif (n, dim, box) if nargin > 3, stk_error ('Too many input arguments.', 'TooManyInputArgs'); end % Read argument n if ~ ((isscalar (n)) && (isnumeric (n))) error ('n should be a numerical scalar.'); end % Read argument dim if (nargin < 2) || ((nargin < 3) && (isempty (dim))) dim = 1; % Default dimension elseif (nargin > 2) && (~ isempty (box)) dim = size (box, 2); end % Read argument box if (nargin < 3) || isempty (box) box = []; % default box: [0; 1] ^ dim else box = stk_hrect (box); % convert input argument to a proper box end if isempty (box) if n == 0 x = stk_dataframe (zeros (0, dim)); % Empty sample else x = stk_dataframe (rand (n, dim)); end else if n == 0 x = stk_dataframe (box, [], {}); % Keep column names x = set_data (x, zeros (0, dim)); % Empty sample else % FIXME: stk_rescale should return a df when box is a df ? x = stk_dataframe (box, [], {}); x = set_data (x, stk_rescale (rand (n, dim), [], box)); end end end % function %% % Check error for incorrect number of input arguments %!shared x, n, dim, box %! n = 10; dim = 2; box = [0, 0; 2, 2]; %!error x = stk_sampling_randunif (); %!test x = stk_sampling_randunif (n); %!test x = stk_sampling_randunif (n, dim); %!test x = stk_sampling_randunif (n, dim, box); %!error x = stk_sampling_randunif (n, dim, box, pi); %% % Check that the output is a dataframe % (all stk_sampling_* functions should behave similarly in this respect) %!assert (isa(x, 'stk_dataframe')); %% % Check that column names are properly set, if available in box %!assert (isequal (x.colnames, {})); %!test %! cn = {'W', 'H'}; box = stk_hrect (box, cn); %! x = stk_sampling_randunif (n, dim, box); %! assert (isequal (x.colnames, cn)); %% % Check output argument %!test %! for dim = 1:5, %! x = stk_sampling_randunif(n, dim); %! assert(isequal(size(x), [n dim])); %! u = double(x); u = u(:); %! assert(~any(isnan(u) | isinf(u))); %! assert((min(u) >= 0) && (max(u) <= 1)); %! end stk/inst/sampling/stk_sampling_regulargrid.m0000644000000000000000000001044113156161544016602 0ustar % STK_SAMPLING_REGULARGRID builds a regular grid % % CALL: X = stk_sampling_regulargrid (N, DIM) % % builds a regular grid in the DIM-dimensional hypercube [0; 1]^DIM. If N is % an integer, a grid of size N is built; in this case, acceptable sizes are % such that N^(1/DIM) is an integer. If N is a vector of length N, a grid of % size prod(N) is built, with N(j) points on coordinate j. % % CALL: X = stk_sampling_regulargrid (N, DIM, BOX) % % does the same thing in the DIM-dimensional hyperrectangle specified by the % argument BOX, which is a 2 x DIM matrix where BOX(1, j) and BOX(2, j) are % the lower- and upper-bound of the interval on the j^th coordinate. % % See also: linspace % Copyright Notice % % Copyright (C) 2017 CentraleSupelec % Copyright (C) 2011-2014 SUPELEC % % Authors: Julien Bect % Emmanuel Vazquez % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function x = stk_sampling_regulargrid (n, dim, box) if nargin > 3, stk_error ('Too many input arguments.', 'TooManyInputArgs'); end % Read argument dim if (nargin < 2) || ((nargin < 3) && (isempty (dim))) dim = 1; % Default dimension elseif (nargin > 2) && (~ isempty (box)) dim = size (box, 2); end % Read argument 'box' if (nargin < 3) || isempty (box) xmin = zeros (1, dim); xmax = ones (1, dim); box_colnames = {}; else box = stk_hrect (box); % convert input argument to a proper box box_data = double (box); box_colnames = get (box, 'colnames'); xmin = box_data(1, :); xmax = box_data(2, :); end if length (n) == 1 n_coord = round (n^(1/dim)); if n_coord ^ dim ~= n, stk_error ('n^(1/dim) should be an integer', 'InvalidArgument'); end n = n_coord * ones (1, dim); else if length (n) ~= dim errmsg = 'n should either be a scalar or a vector of length d'; stk_error (errmsg, 'IncorrectSize'); end end % levels levels = cell (1, dim); for j = 1:dim, levels{j} = linspace (xmin(j), xmax(j), n(j)); end x = stk_factorialdesign (levels, box_colnames); end % function %#ok<*TRYNC> %% % Check error for incorrect number of input arguments %!shared x, n, dim, box %! n = 9; dim = 2; box = [0, 0; 1, 1]; %!error x = stk_sampling_regulargrid (); %!test x = stk_sampling_regulargrid (n); %!test x = stk_sampling_regulargrid (n, dim); %!test x = stk_sampling_regulargrid (n, dim, box); %!error x = stk_sampling_regulargrid (n, dim, box, pi); %% % Check that the output is an stk_dataframe % (all stk_sampling_* functions should behave similarly in this respect) % and an stk_factorialdesign (special kind of stk_dataframe) %!assert (isa (x, 'stk_dataframe')); %!assert (isa (x, 'stk_factorialdesign')); %% % Check that column names are properly set, if available in box %!assert (isequal (x.colnames, {})); %!test %! cn = {'W', 'H'}; box = stk_hrect (box, cn); %! x = stk_sampling_regulargrid (n, dim, box); %! assert (isequal (x.colnames, cn)); %% % Check output argument %!test %! for dim = 1:3, %! n = 3^dim; %! x = stk_sampling_regulargrid(n, dim); %! assert(isequal(size(x), [n dim])); %! u = double(x); u = u(:); %! assert(~any(isnan(u) | isinf(u))); %! assert((min(u) >= 0) && (max(u) <= 1)); %! end %!test %! nn = [3 4 5]; %! for dim = 1:3, %! x = stk_sampling_regulargrid(nn(1:dim), dim); %! assert(isequal(size(x), [prod(nn(1:dim)) dim])); %! u = double(x); u = u(:); %! assert(~any(isnan(u) | isinf(u))); %! assert((min(u) >= 0) && (max(u) <= 1)); %! end stk/inst/sampling/stk_sampling_sobol.m0000644000000000000000000001012713156161544015412 0ustar % STK_SAMPLING_SOBOL generates points from a Sobol sequence % % CALL: X = stk_sampling_sobol (N, D) % % computes the first N terms of a D-dimensional Sobol sequence (with % N < 2^32 and D <= 1111). The sequence is generated using the algorithm % of Bratley and Fox [1], as modified by Joe and Kuo [3]. % % CALL: X = stk_sampling_sobol (N, DIM, BOX) % % does the same thing in the DIM-dimensional hyperrectangle specified by the % argument BOX, which is a 2 x DIM matrix where BOX(1, j) and BOX(2, j) are % the lower- and upper-bound of the interval on the j^th coordinate. % % CALL: X = stk_sampling_sobol (N, D, BOX, DO_SKIP) % % skips an initial segment of the Sobol sequence if DO_SKIP is true. More % precisely, according to the recommendation of [2] and [3], a number of % points equal to the largest power of 2 smaller than n is skipped. If % DO_SKIP is false, the beginning of the sequence is returns, as in the % previous cases (in other words, DO_SKIP = false is the default). % % NOTE: Implementation % % The C implementation under the hood is due to Steven G. Johnson, and % was borrowed from the NLopt toolbox [4] (version 2.4.2). % % REFERENCE % % [1] Paul Bratley and Bennett L. Fox, "Algorithm 659: Implementing Sobol's % quasirandom sequence generator", ACM Transactions on Mathematical % Software, 14(1):88-100, 1988. % % [2] Peter Acworth, Mark Broadie and Paul Glasserman, "A Comparison of Some % Monte Carlo and Quasi Monte Carlo Techniques for Option Pricing", in % Monte Carlo and Quasi-Monte Carlo Methods 1996, Lecture Notes in % Statistics 27:1-18, Springer, 1998. % % [3] Stephen Joe and Frances Y. Kuo, "Remark on Algorithm 659: Implementing % Sobol's Quasirandom Sequence Generator', ACM Transactions on % Mathematical Software, 29(1):49-57, 2003. % % [4] Steven G. Johnson, The NLopt nonlinear-optimization package, % http://ab-initio.mit.edu/nlopt. % % SEE ALSO: stk_sampling_halton_rr2 % Copyright Notice % % Copyright (C) 2016, 2017 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function x = stk_sampling_sobol (n, dim, box, do_skip) if nargin > 4 stk_error ('Too many input arguments.', 'TooManyInputArgs'); end % Default values if nargin < 4 do_skip = false; if nargin < 3 box = []; if nargin < 2 dim = []; end end end % Check that either dim or box is provided if (isempty (dim)) && (isempty (box)) stk_error (['The dimension argument can be omitted if, and only if, a ' ... 'valid box argument is provided instead.'], 'InvalidArgument'); end % Process box argument if isempty (box) colnames = {}; else box = stk_hrect (box); % convert input argument to a proper box colnames = box.colnames; if isempty (dim) dim = size (box, 2); elseif dim ~= size (box, 2) stk_error (['The dimension argument must be compatible with' ... 'the box argument when both are provided.'], 'InvalidArgument'); end end % Generate a Sobol sequence in [0; 1]^dim x = transpose (__stk_sampling_sobol_mex__ (n, dim, do_skip)); % Create dataframe output x = stk_dataframe (x, colnames); if ~ isempty (box), x = stk_rescale (x, [], box); end end % function stk/inst/sampling/stk_sampling_vdc_rr2.m0000644000000000000000000000410213156161544015631 0ustar % STK_SAMPLING_VDC_RR2 generates points from the "RR2" van der Corput sequence % % CALL: X = __stk_sampling_vdc_rr2__(N, J) % % computes the first N terms of the j^th RR2-scrambled van der Corput % sequence. % % REFERENCE % % Ladislav Kocis and William J. Whiten, "Computational investigations of low % discrepancy sequences", ACM Transactions on Mathematical Software, % 23(2):266-294, 1997. % http://dx.doi.org/10.1145/264029.264064 % % SEE ALSO: stk_sampling_halton_rr2 % Copyright Notice % % Copyright (C) 2013 Alexandra Krauth, Elham Rahali & SUPELEC % % Authors: Julien Bect % Alexandra Krauth % Elham Rahali % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . %!error __stk_sampling_vdc_rr2__() % two inputs required %!error __stk_sampling_vdc_rr2__(10) % two inputs required %!error __stk_sampling_vdc_rr2__(10, 3, -1) % two inputs required %!test %! n = 300; j = 25; %! x = __stk_sampling_vdc_rr2__(n, j); %! assert(isequal(size(x), [n 1])) %!test %! x = __stk_sampling_vdc_rr2__(2000, 7); %! y = double (x(1998:2000, :)); %! yref = [0.849786281294525; 0.085080398941584; 0.555668634235701]; %! assert(stk_isequal_tolrel(y, yref, 1e-13)); stk/inst/stk_init.m0000644000000000000000000002252013156161544011533 0ustar % STK_INIT initializes the STK % % CALL: stk_init () % % STK_INIT sets paths and environment variables % Copyright Notice % % Copyright (C) 2015-2017 CentraleSupelec % Copyright (C) 2011-2014 SUPELEC % % Authors: Julien Bect % Emmanuel Vazquez % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . %% PKG_ADD: stk_init ('pkg_load'); %% PKG_DEL: stk_init ('pkg_unload'); function output = stk_init (command) if nargin == 0 command = 'pkg_load'; end % Deduce the root of STK from the path to this script root = fileparts (mfilename ('fullpath')); switch command case 'pkg_load' stk_init__pkg_load (root); case 'pkg_unload' stk_init__pkg_unload (root); case 'prune_mole' stk_init__config_mole (root, false, true); % prune, but do not add to path case 'clear_persistents' % Note: this implies munlock stk_init__clear_persistents (); case 'munlock' stk_init__munlock (); case 'addpath' % Add STK subdirectories to the search path stk_init__addpath (root); case 'rmpath' % Remove STK subdirectories from the search path stk_init__rmpath (root); case 'genpath' % Return the list of all STK "public" subdirectories output = stk_init__genpath (root); otherwise error ('Unknown command.'); end % switch end % function %#ok<*NODEF,*WNTAG,*SPERR,*SPWRN,*LERR,*CTCH,*SPERR> function stk_init__pkg_load (root) % Unlock all possibly mlock-ed STK files and clear all STK functions % that contain persistent variables stk_init__clear_persistents (); % Add STK subdirectories to the path stk_init__addpath (root); % Set default options stk_options_set (); % Select default "parallelization engine" stk_parallel_engine_set (); % Hide some warnings about numerical accuracy warning ('off', 'STK:stk_predict:NegativeVariancesSetToZero'); warning ('off', 'STK:stk_cholcov:AddingRegularizationNoise'); warning ('off', 'STK:stk_param_relik:NumericalAccuracyProblem'); % Uncomment this line if you want to see a lot of details about the internals % of stk_dataframe and stk_factorialdesign objects: % stk_options_set ('stk_dataframe', 'disp_format', 'verbose'); end % function function stk_init__pkg_unload (root) % Unlock all possibly mlock-ed STK files and clear all STK functions % that contain persistent variables stk_init__clear_persistents (); % Remove STK subdirectories from the path stk_init__rmpath (root); end % function function stk_init__munlock () filenames = { ... 'stk_optim_fmincon', ... 'stk_options_set', ... 'stk_parallel_engine_set' }; for i = 1:(length (filenames)) name = filenames{i}; if mislocked (name) munlock (name); end end end % function function stk_init__clear_persistents () stk_init__munlock (); filenames = { ... 'stk_disp_progress', ... 'stk_gausscov_iso', ... 'stk_gausscov_aniso', ... 'stk_materncov_aniso', ... 'stk_materncov_iso', ... 'stk_materncov32_aniso', ... 'stk_materncov32_iso', ... 'stk_materncov52_aniso', ... 'stk_materncov52_iso', ... 'stk_optim_fmincon', ... 'stk_options_set', ... 'stk_parallel_engine_set' }; for i = 1:(length (filenames)) clear (filenames{i}); end end % function function stk_init__addpath (root) path = stk_init__genpath (root); % Check for missing directories for i = 1:length (path) if ~ exist (path{i}, 'dir') error (sprintf (['Directory %s does not exist.\n' ... 'Is there a problem in stk_init__genpath ?'], path{i})); end end % Add STK folders to the path addpath (path{:}); % Selectively add MOLE subdirectories to compensate for missing functions stk_init__config_mole (root, true, false); % (add to path, but do not prune) end % function function path = stk_init__genpath (root) path = {}; % main function folders path = [path { ... fullfile(root, 'arrays' ) ... fullfile(root, 'arrays', 'generic' ) ... fullfile(root, 'core' ) ... fullfile(root, 'covfcs' ) ... fullfile(root, 'covfcs', 'rbf' ) ... fullfile(root, 'lm' ) ... fullfile(root, 'param', 'classes' ) ... fullfile(root, 'param', 'estim' ) ... fullfile(root, 'sampling' ) ... fullfile(root, 'utils' ) }]; % 'misc' folder and its subfolders misc = fullfile (root, 'misc'); path = [path { ... fullfile(misc, 'design' ) ... fullfile(misc, 'dist' ) ... fullfile(misc, 'distrib' ) ... fullfile(misc, 'error' ) ... fullfile(misc, 'optim' ) ... fullfile(misc, 'options' ) ... fullfile(misc, 'parallel') ... fullfile(misc, 'pareto' ) ... fullfile(misc, 'plot' ) ... fullfile(misc, 'test' ) ... fullfile(misc, 'text' ) }]; % folders that contain examples path = [path { ... fullfile(root, 'examples', '01_kriging_basics' ) ... fullfile(root, 'examples', '02_design_of_experiments') ... fullfile(root, 'examples', '03_miscellaneous' ) ... fullfile(root, 'examples', 'datasets' ) ... fullfile(root, 'examples', 'test_functions' ) }]; end % function function stk_init__rmpath (root) s = path (); regex1 = strcat ('^', escape_regexp (root)); try % Use the modern name (__octave_config_info__) if possible apiver = __octave_config_info__ ('api_version'); assert (ischar (apiver)); catch % Use the old name instead apiver = octave_config_info ('api_version'); end regex2 = strcat (escape_regexp (apiver), '$'); while ~ isempty (s) [d, s] = strtok (s, pathsep); %#ok if (~ isempty (regexp (d, regex1, 'once'))) ... && (isempty (regexp (d, regex2, 'once'))) ... && (~ strcmp (d, root)) % Only remove subdirectories, not the root rmpath (d); end end end % function function s = escape_regexp (s) s = strrep (s, '\', '\\'); s = strrep (s, '+', '\+'); s = strrep (s, '.', '\.'); end % function function stk_init__config_mole (root, do_addpath, prune_unused) mole_dir = fullfile (root, 'misc', 'mole'); isoctave = (exist ('OCTAVE_VERSION', 'builtin') == 5); if isoctave recursive_rmdir_state = confirm_recursive_rmdir (0); end opts = {root, mole_dir, do_addpath, prune_unused}; % Provide missing octave functions for Matlab users % TODO: extract functions that are REALLY needed in separate directories % and get rid of the others ! if (exist ('OCTAVE_VERSION', 'builtin') ~= 5) % if Matlab if do_addpath addpath (fullfile (mole_dir, 'matlab')); end elseif prune_unused rmdir (fullfile (mole_dir, 'matlab'), 's'); end % graphics_toolkit % * For Octave users: graphics_toolkit is missing in some old version of Octave % * For Matlab users: there is no function named graphics_toolkit in Matlab. % Our implementation returns either 'matlab-jvm' or 'matlab-nojvm'. install_mole_function ('graphics_toolkit', opts{:}); % isrow % * For Octave users: ? % * For Matlab users: missing in R2007a install_mole_function ('isrow', opts{:}); % linsolve % * For Octave users: linsolve has been missing in Octave for a long time % (up to 3.6.4) % * For Matlab users: ? install_mole_function ('linsolve', opts{:}); % quantile % * For Octave users: ? % * For Matlab users: quantile is missing from Matlab itself, but it provided % by the Statistics toolbox if you're rich enough to afford it. install_mole_function ('quantile', opts{:}); % cleanup if isoctave confirm_recursive_rmdir (recursive_rmdir_state); end end % function function install_mole_function (funct_name, ... root, mole_dir, do_addpath, prune_unused) function_dir = fullfile (mole_dir, funct_name); w = which (funct_name); if (isempty (w)) || (~ isempty (strfind (w, root))) % if the function is absent function_mfile = fullfile (function_dir, [funct_name '.m']); if exist (function_dir, 'dir') && exist (function_mfile, 'file') % fprintf ('[MOLE] Providing function %s\n', function_name); if do_addpath addpath (function_dir); end else warning (sprintf ('[MOLE] Missing function: %s\n', funct_name)); end elseif prune_unused && (exist (function_dir, 'dir')) rmdir (function_dir, 's'); end end % function stk/inst/stk_version.m0000644000000000000000000000212013156161544012247 0ustar % STK_VERSION returns STK's version number % Copyright Notice % % Copyright (C) 2015-2017 CentraleSupelec % Copyright (C) 2013, 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function v = stk_version () v = '2.5.0'; end % function stk/inst/utils/0000755000000000000000000000000013156161544010670 5ustar stk/inst/utils/stk_conditioning.m0000644000000000000000000001362113156161544014416 0ustar % STK_CONDITIONING produces conditioned sample paths % % CALL: ZSIMC = stk_conditioning (LAMBDA, ZI, ZSIM, XI_IND) % % produces conditioned sample paths ZSMIC from the unconditioned sample paths % ZSIM, using the matrix of kriging weights LAMBDA. Conditioning is done with % respect to a finite number NI of observations, located at the indices given % in XI_IND (vector of length NI), with corresponding noiseless observed % values ZI. % % The matrix LAMBDA must be of size NI x N, where N is the number of % evaluation points for the sample paths; such a matrix is typically provided % by stk_predict(). % % Both ZSIM and ZSIMC have size N x NB_PATHS, where NB_PATH is the number % sample paths to be dealt with. ZI is a column of length NI. % % CALL: ZSIMC = stk_conditioning (LAMBDA, ZI, ZSIM) % % assumes that the oberved values ZI correspond to the first NI evaluation % points. % % CALL: ZSIMC = stk_conditioning (LAMBDA, ZI, ZSIM, XI_IND, NOISE_SIM) % % produces conditioned sample paths ZSMIC from the unconditioned sample paths % ZSIM, using the matrix of kriging weights LAMBDA. Conditioning is done with % respect to a finite number NI of observations, located at the indices given % in XI_IND (vector of length NI), with corresponding noisy observed values % ZI, using a NI x N matrix NOISE_SIM of simulated noise values. % % NOTE: Conditioning by kriging % % stk_conditioning uses the technique called "conditioning by kriging" % (see, e.g., Chiles and Delfiner, Geostatistics: Modeling Spatial % Uncertainty, Wiley, 1999) % % NOTE: Output type % % The output argument ZSIMC will be an stk_dataframe if either LAMBDA or ZSIM % are stk_dataframe. In case of conflicting row names (coming from % ZSIM.rownames on the one hand and LAMBDA.colnames on the other hand), % ZSIMC.rownames is {}. % % EXAMPLE: stk_example_kb05 % % See also stk_generate_samplepaths, stk_predict % Copyright Notice % % Copyright (C) 2015 CentraleSupelec % Copyright (C) 2011-2014 SUPELEC % % Authors: Julien Bect % Emmanuel Vazquez % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function zsimc = stk_conditioning (lambda, zi, z_sim, xi_ind, noise_sim) if nargin > 5, stk_error ('Too many input arguments.', 'TooManyInputArgs'); end % Are we dealing with noisy observations ? noisy = (nargin > 4) && (~ isempty (noise_sim)); zi = double (zi); z_sim = double (z_sim); [ni, n] = size (lambda); m = size (z_sim, 2); if (nargin < 4) || (isempty (xi_ind)) xi_ind = (1:ni)'; else xi_ind = xi_ind(:); end if ~ isequal (size (zi), [ni 1]) stk_error (sprintf (['Considering the size of lambda (%d x %d), zi ' ... 'should have size %d x 1'], ni, n, ni), 'IncorrectSize'); end if ~ isequal (size (z_sim), [n m]) stk_error (sprintf (['Considering the size of lambda (%d x %d), zsim ' ... 'should have size %d x N, where N is the number of evaluation ' ... 'points for the sample paths.'], ni, n, n), 'IncorrectSize'); end if ~ isequal (size (xi_ind), [ni 1]) stk_error (sprintf (['Considering the size of lambda (%d x %d), xi_ind ' ... 'should have size %d x 1'], ni, n, ni), 'IncorrectSize'); end if noisy && (~ isequal (size (noise_sim), [ni m])) stk_error (sprintf (['Considering the size of lambda (%d x %d) and the ' ... 'size of z_sim (%d x %d), noise_sim should have size %d x %d'], ni, ... n, n, m, ni, m), 'IncorrectSize'); end delta = bsxfun (@minus, zi, z_sim(xi_ind, :)); if noisy delta = delta - noise_sim; end zsimc = z_sim + lambda' * delta; end % function %!shared n, m, ni, xi_ind, lambda, zsim, zi %! %! n = 50; m = 5; ni = 10; xi_ind = 1:ni; %! lambda = 1/ni * ones (ni, n); % prediction == averaging %! zsim = ones (n, m); % const unconditioned samplepaths %! zi = zeros (ni, 1); % conditioning by zeros %!error zsimc = stk_conditioning (); %!error zsimc = stk_conditioning (lambda); %!error zsimc = stk_conditioning (lambda, zi); %!test zsimc = stk_conditioning (lambda, zi, zsim); %!test zsimc = stk_conditioning (lambda, zi, zsim, xi_ind); %!error zsimc = stk_conditioning (lambda, zi, zsim, xi_ind, pi^2); %!test %! zsimc = stk_conditioning (lambda, zi, zsim, xi_ind); %! assert (stk_isequal_tolabs (double (zsimc), zeros (n, m))); %!test %! zi = 2 * ones (ni, 1); % conditioning by twos %! zsimc = stk_conditioning (lambda, zi, zsim, xi_ind); %! assert (stk_isequal_tolabs (double (zsimc), 2 * ones (n, m))); %!test %! DIM = 1; nt = 400; %! xt = stk_sampling_regulargrid (nt, DIM, [-1.0; 1.0]); %! %! NI = 6; xi_ind = [1 20 90 200 300 350]; %! xi = xt(xi_ind, 1); %! zi = (1:NI)'; % linear response ;-) %! %! % Carry out the kriging prediction at points xt %! model = stk_model ('stk_materncov52_iso'); %! model.param = log ([1.0; 2.9]); %! [ignore_zp, lambda] = stk_predict (model, xi, [], xt); %! %! % Generate (unconditional) sample paths according to the model %! NB_PATHS = 10; %! zsim = stk_generate_samplepaths (model, xt, NB_PATHS); %! zsimc = stk_conditioning (lambda, zi, zsim, xi_ind); stk/inst/utils/stk_generate_samplepaths.m0000644000000000000000000001764413156161544016136 0ustar % STK_GENERATE_SAMPLEPATHS generates sample paths of a Gaussian process % % CALL: ZSIM = stk_generate_samplepaths (MODEL, XT) % % generates one sample path ZSIM of the Gaussian process MODEL discretized on % the evaluation points XT. The input argument XT can be either a numerical % matrix or a dataframe. The output argument ZSIM has the same number of % rows as XT. More precisely, on a factor space of dimension DIM, % % * XT must have size NS x DIM, % * ZSIM will have size NS x 1, % % where NS is the number of simulation points. % % Note that, in the case where MODEL is a model for noisy observations, this % function simulates sample paths of the underlying (latent) Gaussian % process, i.e., noiseless observations. % % CALL: ZSIM = stk_generate_samplepaths (MODEL, XT, NB_PATHS) % % generates NB_PATHS sample paths at once. In this case, the output argument % ZSIM has size NS x NB_PATHS. % % CALL: ZSIM = stk_generate_samplepaths (MODEL, XI, ZI, XT) % % generates one sample path ZSIM, using the kriging model MODEL and the % evaluation points XT, conditional on the evaluations (XI, ZI). % % CALL: ZSIM = stk_generate_samplepaths (MODEL, XI, ZI, XT, NB_PATHS) % % generates NB_PATHS conditional sample paths at once. % % NOTE: Sample size limitation % % This function generates (discretized) sample paths using a Cholesky % factorization of the covariance matrix, and is therefore restricted to % moderate values of the number of evaluation points. % % NOTE: Output type % % The output argument ZSIM is a plain (double precision) numerical array, % even if XT is a data frame. Row names can be added afterwards as follows: % % ZSIM = stk_generate_samplepaths (MODEL, XT); % ZSIM = stk_dataframe (ZSIM, {}, XT.rownames); % % EXAMPLES: see stk_example_kb05, stk_example_kb07 % % See also stk_conditioning, stk_cholcov % Copyright Notice % % Copyright (C) 2015-2017 CentraleSupelec % Copyright (C) 2011-2014 SUPELEC % % Authors: Julien Bect % Emmanuel Vazquez % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function zsim = stk_generate_samplepaths (model, varargin) % Note: we know that none of the input argument is an stk_dataframe object % (otherwise we would have ended up in @stk_dataframe/stk_generate_samplepaths) switch nargin case {0, 1} stk_error ('Not enough input arguments.', 'NotEnoughInputArgs'); case 2 % CALL: ZSIM = stk_generate_samplepaths (MODEL, XT) xt = varargin{1}; nb_paths = 1; conditional = false; case 3 % CALL: ZSIM = stk_generate_samplepaths (MODEL, XT, NB_PATHS) xt = varargin{1}; nb_paths = varargin{2}; conditional = false; case 4 % CALL: ZSIM = stk_generate_samplepaths (MODEL, XI, ZI, XT) xi = varargin{1}; zi = varargin{2}; xt = varargin{3}; nb_paths = 1; conditional = true; case 5 % CALL: ZSIM = stk_generate_samplepaths (MODEL, XI, ZI, XT, NB_PATHS) xi = varargin{1}; zi = varargin{2}; xt = varargin{3}; nb_paths = varargin{4}; conditional = true; otherwise stk_error ('Too many input arguments.', 'TooManyInputArgs'); end %--- Process input arguments --------------------------------------------------- % Extract row names from xt xt = double (xt); % Check nb_paths argument nb_paths = double (nb_paths); if ~ isscalar (nb_paths) || ~ (nb_paths > 0) stk_error ('nb_paths must be a positive scalar', 'Invalid argument'); end %--- Extend xt with the observation points, if needed -------------------------- if conditional % Keep only numerical data for xi, zi xi = double (xi); zi = double (zi); % Conditioning by kriging => we must simulate on the observation points too xt = [xi; xt]; xi_ind = 1:(size (xi, 1)); end % FIXME: Avoid duplicating observations points if xi is a subset of xt %--- Generate unconditional sample paths -------------------------------------- % Pick unique simulation points [xt_unique, ignd, j] = unique (xt, 'rows'); %#ok CG#07 % Did we actually find duplicates in xt ? duplicates_detected = (size (xt_unique, 1) < size (xt, 1)); % Compute the covariance matrix % (even if there no duplicates, it is not guaranteed % that xt_unique and xt are equal) if duplicates_detected K = stk_make_matcov (model, xt_unique, xt_unique); else K = stk_make_matcov (model, xt, xt); end % Cholesky factorization of the covariance matrix V = stk_cholcov (K); % Generates samplepaths zsim = V' * randn (size (K, 1), nb_paths); % Duplicate simulated values, if necessary if duplicates_detected, zsim = zsim(j, :); end %--- Generate conditional sample paths ---------------------------------------- if conditional % Carry out the kriging prediction at points xt [ignd, lambda] = stk_predict (model, xi, zi, xt); %#ok CG#07 if ~ stk_isnoisy (model) % Simulate sample paths conditioned on noiseless observations zsim = stk_conditioning (lambda, zi, zsim, xi_ind); else % Noisy case % Simulate noise values s = sqrt (exp (model.lognoisevariance)); ni = length (xi_ind); if isscalar (s) noise_sim = s * randn (ni, nb_paths); else s = reshape (s, ni, 1); noise_sim = bsxfun (@times, s, randn (ni, nb_paths)); end % Simulate sample paths conditioned on noisy observations zsim = stk_conditioning (lambda, zi, zsim, xi_ind, noise_sim); end % TEMPORARY FIX (until stk_conditioning is fixed as well) zsim = double (zsim); zsim(xi_ind, :) = []; end end % function %!shared model, xi, zi, xt, n, nb_paths %! dim = 1; n = 50; nb_paths = 5; %! model = stk_model ('stk_materncov32_iso', dim); %! model.param = log ([1.0; 2.9]); %! xt = stk_sampling_regulargrid (n, dim, [-1.0; 1.0]); %! xi = [xt(1, :); xt(end, :)]; zi = [0; 0]; %!error zsim = stk_generate_samplepaths (); %!error zsim = stk_generate_samplepaths (model); %!test zsim = stk_generate_samplepaths (model, xt); %!test zsim = stk_generate_samplepaths (model, xt, nb_paths); %!test zsim = stk_generate_samplepaths (model, xi, zi, xt); %!test zsim = stk_generate_samplepaths (model, xi, zi, xt, nb_paths); %!error zsim = stk_generate_samplepaths (model, xi, zi, xt, nb_paths, log (2)); %!test %! zsim = stk_generate_samplepaths (model, xt); %! assert (isequal (size (zsim), [n, 1])); %!test %! zsim = stk_generate_samplepaths (model, xt, nb_paths); %! assert (isequal (size (zsim), [n, nb_paths])); %!test % duplicate simulation points %! zsim = stk_generate_samplepaths (model, [xt; xt], nb_paths); %! assert (isequal (size (zsim), [2 * n, nb_paths])); %! assert (isequal (zsim(1:n, :), zsim((n + 1):end, :))); %!test % simulation points equal to observation points (noiseless model) %! % https://sourceforge.net/p/kriging/tickets/14/ %! zsim = stk_generate_samplepaths (model, xt, zeros (n, 1), xt); %! assert (isequal (zsim, zeros (n, 1))); stk/inst/utils/stk_plot1d.m0000644000000000000000000001100313156161544013125 0ustar % STK_PLOT1D is a convenient plot function for 1D kriging predictions % % CALL: stk_plot1d (XI, ZI, XT, ZT, ZP) % % plots the evaluation points (XI, ZI), the "true function" with values % ZT on the grid XT, and a representation of the prediction ZP on the % same grid XT: the kriging prediction (posterior mean) surrounded by a % shaded area corresponding to 95% pointwise confidence intervals. % % It is possible to omit plotting either the observations (XI, ZI) or % the true function ZT by providing empty matrices. % % CALL: stk_plot1d (XI, ZI, XT, ZT, ZP, ZSIM) % % also plots a set ZSIM of samplepaths. % % CALL: stk_plot1d (H_AXES, ...) % % plots into existing axes with axis handle H_AXES. % % CALL: H_PLOT = stk_plot1d (...) % % returns the handles of the drawing in a structure. % Copyright Notice % % Copyright (C) 2015-2017 CentraleSupelec % Copyright (C) 2011-2014 SUPELEC % % Authors: Julien Bect % Emmanuel Vazquez % Remi Stroh % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function h_plot = stk_plot1d (varargin) % Extract axis handle (if it is present) [h_axes, varargin] = stk_plot_getaxesarg (varargin{:}); if nargout < 1 stk_plot1d_ (h_axes, varargin{:}); % Do not display the handles if they are not asked (graphical option) else h_plot = stk_plot1d_ (h_axes, varargin{:}); end end % function function h = stk_plot1d_ (h_axes, xi, zi, xt, zt, zp, zsim) has_zt_arg = (nargin > 4) && (~ isempty (zt)); has_zp_arg = (nargin > 5) && (~ isempty (zp)); has_zsim_arg = (nargin > 6) && (~ isempty (zsim)); if (nargin > 3) && (~ isempty (xt)) [xt, idx_sort] = sort (xt); end % Shaded area representing pointwise confidence intervals if has_zp_arg % Sort zp zp = zp(idx_sort, :); h_ci = stk_plot_shadedci (h_axes, xt, zp); hold on; else h_ci = []; end % Plot sample paths if has_zsim_arg % Sort zsim zsim = zsim(idx_sort, :); if isa (zsim, 'stk_dataframe') % Prevents automatic creation of a legend by @stk_dataframe/plot zsim.colnames = {}; end h_sim = plot (h_axes, xt, zsim, ... '-', 'LineWidth', 1, 'Color', [0.39, 0.47, 0.64]); hold on; else h_sim = []; end % Ground truth if has_zt_arg % Sort zt zt = zt(idx_sort, :); h_truth = plot (h_axes, xt, zt, ... '--', 'LineWidth', 3, 'Color', [0.39, 0.47, 0.64]); hold on; else h_truth = []; end % Kriging predictor (posterior mean) if has_zp_arg % zp has already been sorted h_pred = plot (h_axes, xt, zp.mean, ... 'LineWidth', 3, 'Color', [0.95 0.25 0.3]); hold on; else h_pred = []; end % Evaluations if ~ isempty (zi) h_obs = plot (h_axes, xi, zi, ... 'ko', 'MarkerSize', 6, 'MarkerFaceColor', 'k'); else h_obs = []; end hold off; set (gca, 'box', 'off'); % Prepare for the legend h_list = []; s_list = {}; if ~ isempty (h_truth) h_list = [h_list; h_truth]; s_list = [s_list; {'True function'}]; end if ~ isempty (h_obs) h_list = [h_list; h_obs]; s_list = [s_list; {'Observations'}]; end if ~ isempty (h_pred) h_list = [h_list; h_pred]; s_list = [s_list; {'Posterior mean'}]; end if ~ isempty (h_ci) h_list = [h_list; h_ci]; s_list = [s_list; {'95% credible interval'}]; end if ~ isempty (h_sim) h_list = [h_list; h_sim(1)]; s_list = [s_list; {'Samplepaths'}]; end % Create the legend h_legend = legend (h_list, s_list{:}); set (h_legend, 'Color', 0.98 * [1 1 1]); legend (h_axes, 'hide'); % Make it possible to recover all the handles easily, if needed h.truth = h_truth; h.obs = h_obs; h.pred = h_pred; h.ci = h_ci; h.sim = h_sim; end % function stk/inst/utils/stk_plot_histnormres.m0000644000000000000000000000466313156161544015353 0ustar % STK_PLOT_HISTNORMRES plots an histogram for normalized residuals % % CALL: H = stk_plot_histnormres (NORM_RES, ...) % % CALL: H = stk_plot_histnormres (H_AXES, NORM_RES, ...) % % See also stk_predict_leaveoneout, stk_example_kb10 % Copyright Notice % % Copyright (C) 2016, 2017 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function h = stk_plot_histnormres (varargin) [h_axes, varargin, n_argin] = stk_plot_getaxesarg (varargin{:}); if n_argin >= 1 norm_res = double (varargin{1}); opts = varargin(2:end); else stk_error ('Not enough input arguments.', 'NotEnoughInputArgs'); end % Ignore infinite normalized residuals, with a warning b = isinf (norm_res); if any (b) warning (sprintf ('Ignoring %d infinite normalized resiudals.', sum (b))); norm_res = norm_res(~ b); end % Choose the number of bins using the Freedman-Diaconis rule n = length (norm_res); q = quantile (norm_res, [0 0.25 0.75 1]); binsize = 2 * (q(3) -q(2)) * (n ^ (- 1/3)); nbins = ceil ((q(4) - q(1)) / binsize); % Compute and plot histogram pdf [count, rr] = hist (norm_res, nbins); pdf = count / (n * (rr(2) - rr(1))); h.hist = bar (rr, pdf, 'hist'); hold on; % Center view M = max (3, max (abs (xlim ()))); xlim ([-M, M]); % Plot reference N(0, 1) pdf rr = linspace (-M, M, 100); pdf_ref = 1 / (sqrt (2 * pi)) * (exp (- 0.5 * (rr .^ 2))); h.ref_pdf = plot (rr, pdf_ref, 'r--'); % Apply options if ~ isempty (opts) set (h.hist, opts{:}); end % Create labels h_labels = stk_labels (h_axes, 'normalized residuals', 'probability density'); h.xlabel = h_labels(1); h.ylabel = h_labels(2); end % function stk/inst/utils/stk_plot_predvsobs.m0000644000000000000000000000363513156161544015003 0ustar % STK_PLOT_PREDVSOBS plots predictions against observations % % CALL: H = stk_plot_predvsobs (Z_OBS, Z_PRED, ...) % % CALL: H = stk_plot_predvsobs (H_AXES, Z_OBS, Z_PRED, ...) % % See also stk_predict_leaveoneout, stk_example_kb10 % Copyright Notice % % Copyright (C) 2016 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function h = stk_plot_predvsobs (varargin) [h_axes, varargin, n_argin] = stk_plot_getaxesarg (varargin{:}); if n_argin >= 2 y = varargin{1}; y_pred = varargin{2}; opts = varargin(3:end); else stk_error ('Not enough input arguments.', 'NotEnoughInputArgs'); end % Extract numerical predictions try y_pred = y_pred.mean; catch y_pred = double (y_pred); end % Plot prediction versus truth h.data = plot (h_axes, y, y_pred, 'kd'); hold on; % Plot "reference" line y_LOO = y h.refline = plot (h_axes, xlim, xlim, 'r--'); % Apply options if ~ isempty (opts) set (h.data, opts{:}); end % Create labels h_labels = stk_labels (h_axes, 'observations', 'predictions'); h.xlabel = h_labels(1); h.ylabel = h_labels(2); end % function stk/inst/utils/stk_plot_probdom2d.m0000644000000000000000000001312013156161544014652 0ustar % STK_PLOT_PROBDOM2D represents the uncertainty about a 2D Pareto % % CALL: stk_plot_probdom2d (MODEL1, MODEL2, BOX) % % represents the uncertainty about the 2D Pareto front associated with the % minimization of models MODEL1 and MODEL2 over the domain BOX. % % Use prior model structures (see stk_model) to represent prior uncertainty. % % Use @stk_model_gpposterior objects to represent posterior uncertainty. % % EXPERIMENTAL FUNCTION WARNING % % This function is currently considered experimental. Because of the very % basic method used to choose the simulation points (uniform IID sampling), % the plots produced by this function are very unreliable representations % on the residual uncertainty on the Pareto front (except perhaps on low- % dimensional problems of moderate difficulty). % % STK users that wish to experiment with it are welcome to do so, but should % be aware of this limitation. We invite them to direct any questions, % remarks or comments about this experimental class to the STK mailing list. % % REFERENCE % % [1] Michael Binois, David Ginsbourger and Olivier Roustant, Quantifying % uncertainty on Pareto fronts with Gaussian Process conditional simu- % lations, European J. of Operational Research, 2043(2):386-394, 2015. % % See also: stk_example_misc04, stk_model, stk_gpposterior % Copyright Notice % % Copyright (C) 2017 CentraleSupelec % Copyright (C) 2014 SUPELEC % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function stk_plot_probdom2d (model1, model2, box) if nargin > 3 stk_error ('Too many input arguments.', 'TooManyInputArgs'); end % FIXME: Provide a convenient way of changing these parameters % Number of additional random points in input space NB_SIMULATION_POINTS = 1000; % Number of sample paths drawn to estimate the probabilities NB_SAMPLEPATHS = 100; % Number of individual sample paths to be plotted % (must be smaller than NB_SAMPLEPATHS) NB_SAMPLEPATHS_PLOT = 20; % Number of test points in the objective space NB_TEST_POINTS = 100 ^ 2; %% Observation points (points where both objectives hae been evaluated) x1 = double (get_input_data (model1)); x2 = double (get_input_data (model2)); x_obs = intersect (x1, x2, 'rows'); %% Simulation points x_sim = stk_sampling_randunif (NB_SIMULATION_POINTS, [], box); x_sim = vertcat (x_sim, x_obs); % FIXME: Optimize the location of simulation points... (IID uniform is perhaps % approximately OK for vague prior models, but *not* for posterior models % obtained at the end of a long optimization procedure...) %% Generate a "large" number of sample paths % Simulate samplepaths y1_sim = double (stk_generate_samplepaths (model1, x_sim, NB_SAMPLEPATHS)); y2_sim = double (stk_generate_samplepaths (model2, x_sim, NB_SAMPLEPATHS)); % Empirical lower/upper bounds for each response y1_min = min (y1_sim(:)); y1_max = max (y1_sim(:)); y2_min = min (y2_sim(:)); y2_max = max (y2_sim(:)); % Axis for a nice plot y1_axis = [y1_min - 0.05 * (y1_max - y1_min), y1_max]; y2_axis = [y2_min - 0.05 * (y2_max - y2_min), y2_max]; %% Plot a few individual sample paths of the Pareto front stk_subplot (1, 2, 1); cm = jet (NB_SAMPLEPATHS_PLOT); for i = 1:NB_SAMPLEPATHS_PLOT % Extract Pareto front y_sim = [y1_sim(:, i) y2_sim(:, i)]; y_nd = y_sim(stk_paretofind (y_sim), :); % Add two extremities to the Pareto front y_nd = [[y_nd(1, 1) y2_max]; y_nd; [y1_max y_nd(end, 2)]]; stairs (y_nd(:, 1), y_nd(:, 2), 'Color', cm(i, :)); stk_labels ('first objective', 'second objective'); % FIXME: Add meaningful labels in a 'robust' way... currently, prior model % structures do not necessarily have a 'response_name' field, and % for posterior model object the 'response_name' field is not % directly accessible... if i == 1 axis ([y1_axis y2_axis]); hold on; end end stk_title ('simulated Pareto fronts'); %% Probability of being dominated % Test points (a grid over the relevant subset of the objective space) y_test = stk_sampling_regulargrid (NB_TEST_POINTS, 2, [y1_axis' y2_axis']); % Compute empirical probabilities isdom = zeros (size (y_test, 1), 1); for i = 1:NB_SAMPLEPATHS y_sim = [y1_sim(:, i) y2_sim(:, i)]; isdom = isdom + stk_isdominated (y_test, y_sim); end isdom = isdom / NB_SAMPLEPATHS; % Figure stk_subplot (1, 2, 2); colormap (hot); pcolor (y_test, isdom); colorbar ('YTick', [0 .25 .5 .75 1], ... 'YTickLabel', {'0%', '25%', '50%', '75%', '100%'}); stk_labels ('first objective', 'second objective'); % FIXME: See above stk_title ('Proba. of being dominated'); % FIXME: Change the aspect ratio of the figure, if it is possible to do it in % a portable way. Figures with 1 x 2 subplots are not pretty... end % function %#ok<*AGROW> stk/inst/utils/stk_pmisclass.m0000644000000000000000000000622613156161544013733 0ustar % STK_PMISCLASS computes the (expected) probability of misclassification % % CALL: P = stk_pmisclass (U, Z_PRED) % % computes the probability of misclassification P with respect to the % threshold U using the posterior means and variances contained in Z_PRED, % where Z_PRED is a dataframe with column names 'mean' and 'var' (as % returned by stk_predict). % % CALL: P = stk_pmisclass (U, Z1_PRED, K12, K22) % % computes the expected probability of misclassification P with respect to % the threshold U at a set of locations X1, assuming that observations are % made at another set of location X2, where: % % * Z1_PRED contains, as above, the posterior means and variances at X1; % % * K12 is the posterior covariance matrix between the values of the process % at X1 and the observations (at X2); % % * K22 is the posterior covariance matrix of the observations. % % See also: stk_predict, stk_example_doe04 % Copyright Notice % % Copyright (C) 2015, 2017 CentraleSupelec % % Author: Julien Bect % Copying Permission Statement % % This file is part of % % STK: a Small (Matlab/Octave) Toolbox for Kriging % (http://sourceforge.net/projects/kriging) % % STK 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. % % STK 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 STK. If not, see . function pmisclass = stk_pmisclass (u, z1_pred, K12, K22) if ~ isscalar (u) stk_error ('u should be a scalar.', 'IncorrectSize'); end % Kriging mean (reduced to the case u = 0) m = bsxfun (@minus, get (z1_pred, 'mean'), u); % Kriging variances and standard deviations v = get (z1_pred, 'var'); s = sqrt (v); % Compute the probability p that the response at xt is *above* 0 and q = 1 - p [q, p] = stk_distrib_normal_cdf (0, m, s); if nargin < 4, % Current posterior probability of misclassification pmisclass = min (p, q); else % Variance of the future predictor if isscalar (K22) if K22 < 0 stk_error ('K22 should be positive.', 'InvalidArgument'); elseif K22 == 0 fpv = v; else fpv = (K12 .^ 2) / K22; end else R = stk_cholcov (K22); M = K12 / R; fpv = sum (M .^ 2, 2); end % Standard deviation of the future predictor fps = sqrt (min (fpv, v)); % Proba that the future predictor is below u p1 = stk_distrib_normal_cdf (0, m, fps); % Proba that both the response and the future predictor are below u p2 = stk_distrib_bivnorm_cdf ([0 0], m, m, fps, s, fps ./ s); pmisclass = q + p1 - 2 * p2; end end % function stk/post_install.m0000644000000000000000000000240513156161544011445 0ustar # POST_INSTALL is run after the installation of the package # Copyright Notice # # Copyright (C) 2014 SUPELEC # Copyright (C) 2015 CentraleSupelec # # Author: Julien Bect # Copying Permission Statement # # This file is part of # # STK: a Small (Matlab/Octave) Toolbox for Kriging # (http://sourceforge.net/projects/kriging) # # STK 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. # # STK 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 STK. If not, see . function post_install (desc) here = pwd (); # Prune unused functions from the MOLE unwind_protect cd (desc.dir); stk_init prune_mole unwind_protect_cleanup cd (here); end_unwind_protect endfunction stk/src/0000755000000000000000000000000013156161544007342 5ustar stk/src/Makefile0000644000000000000000000000157513156161544011012 0ustar all: \ __stk_dist_pairwise__.mex \ __get_column_number__.mex \ __stk_dist_matrixy__.mex \ __stk_filldist_discr_mex__.mex \ __stk_gpquadform_matrixy__.mex \ __stk_isdominated_mex__.mex \ __stk_mindist_mex__.mex \ __stk_dist_matrixx__.mex \ __stk_dist_pairwise__.mex \ __stk_gpquadform_matrixx__.mex \ __stk_gpquadform_pairwise__.mex \ __stk_paretofind_mex__.mex \ __stk_sampling_vdc_rr2__.mex \ __stk_sampling_sobol_mex__.mex \ __stk_distrib_bivnorm0_cdf__.mex \ __stk_dominatedhv_mex__.mex __%__.mex: stk_mex.h __stk_sampling_vdc_rr2__.mex: primes.h __stk_paretofind_mex__.mex: pareto.h __stk_isdominated_mex__.mex: pareto.h __stk_dominatedhv_mex__.mex: wfg.h MKOCTFILE ?= mkoctfile __%__.mex: %.c $(MKOCTFILE) --mex --output $@ $< __stk_dominatedhv_mex__.mex: stk_dominatedhv_mex.c wfg.c $(MKOCTFILE) --mex --output $@ $< wfg.c .PHONY: clean clean: rm -f *.o *.mex stk/src/get_column_number.c0000644000000000000000000001614013156161544013214 0ustar /***************************************************************************** * * * Small (Matlab/Octave) Toolbox for Kriging * * * * Copyright Notice * * * * Copyright (C) 2013 SUPELEC * * * * Author: Julien Bect * * * * Copying Permission Statement * * * * This file is part of * * * * STK: a Small (Matlab/Octave) Toolbox for Kriging * * (http://sourceforge.net/projects/kriging) * * * * STK 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. * * * * STK 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 STK. If not, see . * * * ****************************************************************************/ #include "string.h" #include "stk_mex.h" #define ICOL_INFO -5 /* will be a -4 in the end */ #define ICOL_ROWNAMES -4 /* will be a -3 in the end */ #define ICOL_COLNAMES -3 /* will be a -2 in the end */ #define ICOL_ENTIRE_DATAFRAME -2 /* will be a -1 in the end */ int get_column_number(const mxArray* mxColNames, char* s) { size_t ncol, cmax, c; char** colnames; mxArray* tmp; int icol, found; if (strcmp (s, "info") == 0) return ICOL_INFO; if (strcmp (s, "rownames") == 0) return ICOL_ROWNAMES; if (strcmp (s, "colnames") == 0) return ICOL_COLNAMES; ncol = mxGetNumberOfElements (mxColNames); if (ncol == 0) { if (strcmp(s, "data") == 0) return ICOL_ENTIRE_DATAFRAME; mexErrMsgTxt ("The dataframe has no column names."); } icol = -1; /* Read colum names and compare with s. We stop when the first match is found, assuming that we are dealing with a well-formed dataframe without duplicated column names. */ colnames = (char**) mxCalloc(ncol, sizeof(char*)); for (c = 0; c < ncol; c++) { tmp = mxGetCell(mxColNames, c); if (tmp == NULL) mexErrMsgTxt("Error while reading column names (mxGetCell)."); colnames[c] = mxArrayToString(tmp); if (colnames[c] == NULL) mexErrMsgTxt("Error while reading column names (mxArrayToString)."); if (strcmp(colnames[c], s) == 0) { icol = (int) c; break; } } /* Maximum c such that colnames[c] must be freed */ found = (icol != -1); cmax = ((found) ? (c) : (ncol - 1)); /* Deal with special cases, in particular LEGACY cases, if no exact match has been found */ if (!found) { if (strcmp(s, "data") == 0) { icol = ICOL_ENTIRE_DATAFRAME; } else if (strcmp(s, "a") == 0) { for (c = 0; c < ncol; c++) if (strcmp(colnames[c], "mean") == 0) { icol = (int) c; break; } if (icol == -1) { icol = ICOL_ENTIRE_DATAFRAME; mexWarnMsgIdAndTxt("STK:subsref_dot:Legacy", "There is no variable named 'a'.\n" " => Assuming that you're an old STK user" " trying to get the entire dataframe."); } else { mexWarnMsgIdAndTxt("STK:subsref_dot:Legacy", "There is no variable named 'a'.\n" " => Assuming that you're an old STK user" " trying to get the kriging mean."); } } else if (strcmp(s, "v") == 0) { for (c = 0; c < ncol; c++) if (strcmp(colnames[c], "var") == 0) { icol = (int) c; break; } if (icol != -1) mexWarnMsgIdAndTxt("STK:subsref_dot:Legacy", "There is no variable named 'v'.\n" " => Assuming that you're an old STK user" " trying to get the kriging variance."); } } /* ERROR if no corresponding column can be found */ if (icol == -1) mexErrMsgIdAndTxt("STK:subsref_dot:UnknownVariable", "There is no variable named %s.", s); /* Free memory used for column names. */ for (c = 0; c <= cmax; c++) mxFree(colnames[c]); mxFree(colnames); return icol; } #define COLNAMES_IN prhs[0] #define PROPNAME_IN prhs[1] #define ICOL_OUT plhs[0] void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { char *s; int icol; /*--- Check number of input/output arguments --------------------------------*/ if (nrhs != 2) mexErrMsgTxt("Incorrect number of input arguments (should be 2)."); if (nlhs > 1) mexErrMsgTxt("Incorrect number of output arguments (should be 1)."); /*--- Read property name ----------------------------------------------------*/ if (!mxIsChar(PROPNAME_IN)) mexErrMsgTxt("PropertyName argument should be of class 'char'."); s = mxArrayToString(PROPNAME_IN); if(s == NULL) mexErrMsgTxt("mxArrayToString failed to process PropertyName argument."); /*--- Which column are we trying to set ? -----------------------------------*/ icol = get_column_number(COLNAMES_IN, s); ICOL_OUT = mxCreateDoubleScalar (icol + 1); mxFree(s); } stk/src/pareto.h0000644000000000000000000002133213156161544011006 0ustar /***************************************************************************** * * * Small (Matlab/Octave) Toolbox for Kriging * * * * Copyright Notice * * * * Copyright (C) 2014 SUPELEC * * * * Author: Julien Bect * * * * Copying Permission Statement * * * * This file is part of * * * * STK: a Small (Matlab/Octave) Toolbox for Kriging * * (http://sourceforge.net/projects/kriging) * * * * STK 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. * * * * STK 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 STK. If not, see . * * * ****************************************************************************/ #ifndef ___LEXICAL_SORT_H___ #define ___LEXICAL_SORT_H___ /* assumes that types SCALAR and LOGICAL are defined */ struct T { int pos; int stride; int dim; const SCALAR *data; }; /*--------------------------------------------------------------*/ void lexical_sort (SCALAR *x, int *idx, int n, int d); int pareto_find (SCALAR *x, int *idx1, int* idx2, int n, int d); void is_dominated (const SCALAR *xa, const SCALAR *xb, LOGICAL *isdom, int *drank, int n, int k, int d); int __lexical_cmp__ (const void *_x, const void *_y); int __is_dominated__ (const struct T *x, const struct T *y); void __init_tab__ (const SCALAR *x, struct T *tab, int n, int d); /*--------------------------------------------------------------*/ int __lexical_cmp__ (const void *_x, const void *_y) { int j, n, d; const SCALAR *px, *py; const struct T *x, *y; /* Cast to const struct T* */ x = (const struct T*) _x; y = (const struct T*) _y; /* Pointers to the actual data */ px = x->data; py = y->data; /* We ASSUME that x and y have the same dim and stride */ d = x->dim; n = x->stride; for (j = 0; j < d; j ++, px += n, py += n) { if ((*px) < (*py)) return -1; /* x < y */ else if ((*px) > (*py)) return +1; /* y > x */ } return 0; /* x == y */ } /*--------------------------------------------------------------*/ /* Is x dominated by y ? */ /* note: SMALLER is better */ int __is_dominated__ (const struct T *x, const struct T *y) { int j, nx, ny, d, any_xgty; const SCALAR *px, *py; /* Pointers to the actual data */ px = x->data; py = y->data; d = x->dim; nx = x->stride; ny = y->stride; any_xgty = 0; /* flag: 1 if we have seen at least one component in y that is strictly better (smaller) */ for (j = 0; j < d; j ++, px += nx, py += ny) { if ((*px) < (*py)) return 0; /* y does not dominate x */ else if ((*px) > (*py)) any_xgty = 1; } return any_xgty; } /*--------------------------------------------------------------*/ /* TODO: templated versions, to handle integer types, single, etc. */ void lexical_sort (SCALAR *x, int *idx, int n, int d) { struct T *tab; int i; /* Prepare tab for sorting */ tab = (struct T *) malloc (n * sizeof (struct T)); __init_tab__ (x, tab, n, d); /* Sort using qsort() from the standard library */ qsort (tab, n, sizeof (struct T), __lexical_cmp__); /* Fill output list */ for (i = 0; i < n; i++) idx[i] = tab[i].pos; free (tab); } /*--------------------------------------------------------------*/ /* TODO: templated versions, to handle integer types, single, etc. */ int pareto_find (SCALAR *x, int *ndpos, int *drank, int n, int d) { /* ndpos: liste de taille n * * ndpos[i] = position in x of the i^th non-dominated point * (i^th in the lexical order) 0 <= i < k * * ndpos[i] = -1 for all i > k * * drank: another list of length n * * drank[i] = rank (in the lexical order, between 0 and k) of * the first dominating point if x[i, :] is dominated * * drank[i] = -1 if x[i, :] is not dominated * * Both lists are assumed to have been allocated by the caller. * * Note: all indices are 0-based in this function. */ struct T *tab; int i, ii, k, pos; /* Prepare tab for sorting */ tab = (struct T *) malloc (n * sizeof (struct T)); __init_tab__ (x, tab, n, d); /* Sort using qsort() from the standard library */ qsort (tab, n, sizeof (struct T), __lexical_cmp__); /* Fill ndpos and drank with -1 */ for (i = 0; i < n; i++) { ndpos[i] = -1; drank[i] = -1; } /* Remove dominated points */ /* i : rank of current point. Start at the SECOND element */ for (i = 1; i < n; i++) for (ii = 0; ii < i; ii++) if ((tab[ii].pos >= 0) && (__is_dominated__ (tab + i, tab + ii))) { drank[tab[i].pos] = ii; tab[i].pos = - 1; break; } /* Note: at this stage, drank contains the rank of the first * dominating point in the FULL (sorted) list of points */ /* Fill ndpos */ k = 0; for (i = 0; i < n; i++) { pos = tab[i].pos; if (pos >= 0) { /* indicates a non-dominated point */ ndpos[k] = pos; tab[i].pos = k; k ++; } } /* Adjust drank to the final list of non-dominated points */ for (i = 0; i < n; i++) if (drank[i] != -1 ) drank[i] = tab[drank[i]].pos; free (tab); return k; } /*--------------------------------------------------------------*/ void is_dominated (const SCALAR *xa, const SCALAR *xb, LOGICAL *isdom, int *drank, int n, int k, int d) { int i, j, b; struct T T1, T2; SCALAR xa1; T1.pos = 0; /* unused */ T1.stride = n; T1.dim = d; T2.pos = 0; /* unused */ T2.stride = k; T2.dim = d; for (i = 0; i < n; i++) { b = 0; /* not dominated, until proved otherwise */ T1.data = xa + i; /* pointer to the current row */ xa1 = xa[i]; /* first element of the current row */ for (j = 0; j < k; j++) { /* xb is assumed to be LEXICALLY SORTED => as soon as the first element becomes bigger than xa1, we know that the current row is not dominated */ if (xb[j] > xa1) break; T2.data = xb + j; if (__is_dominated__ (&T1, &T2)) { b = 1; break; } } if (b) { drank[i] = j; isdom[i] = (LOGICAL) 1; } else { drank[i] = -1; isdom[i] = (LOGICAL) 0; } } } /*--------------------------------------------------------------*/ void __init_tab__ (const SCALAR *x, struct T *tab, int n, int d) { int i; /* Fill in array to be sorted */ for (i = 0; i < n; i++) { tab[i].pos = i; tab[i].data = x + i; tab[i].dim = d; tab[i].stride = n; } } #endif stk/src/primes.h0000644000000000000000000024064513156161544011025 0ustar #ifndef ___FIRST10000PRIMES_H___ #define ___FIRST10000PRIMES_H___ /* The First 10,000 Primes (the 10,000th is 104,729) For more information on primes see http://primes.utm.edu/ */ #define PRIMES_TABLE_SIZE 10000 unsigned int primes_table[PRIMES_TABLE_SIZE] = { 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997, 1009, 1013, 1019, 1021, 1031, 1033, 1039, 1049, 1051, 1061, 1063, 1069, 1087, 1091, 1093, 1097, 1103, 1109, 1117, 1123, 1129, 1151, 1153, 1163, 1171, 1181, 1187, 1193, 1201, 1213, 1217, 1223, 1229, 1231, 1237, 1249, 1259, 1277, 1279, 1283, 1289, 1291, 1297, 1301, 1303, 1307, 1319, 1321, 1327, 1361, 1367, 1373, 1381, 1399, 1409, 1423, 1427, 1429, 1433, 1439, 1447, 1451, 1453, 1459, 1471, 1481, 1483, 1487, 1489, 1493, 1499, 1511, 1523, 1531, 1543, 1549, 1553, 1559, 1567, 1571, 1579, 1583, 1597, 1601, 1607, 1609, 1613, 1619, 1621, 1627, 1637, 1657, 1663, 1667, 1669, 1693, 1697, 1699, 1709, 1721, 1723, 1733, 1741, 1747, 1753, 1759, 1777, 1783, 1787, 1789, 1801, 1811, 1823, 1831, 1847, 1861, 1867, 1871, 1873, 1877, 1879, 1889, 1901, 1907, 1913, 1931, 1933, 1949, 1951, 1973, 1979, 1987, 1993, 1997, 1999, 2003, 2011, 2017, 2027, 2029, 2039, 2053, 2063, 2069, 2081, 2083, 2087, 2089, 2099, 2111, 2113, 2129, 2131, 2137, 2141, 2143, 2153, 2161, 2179, 2203, 2207, 2213, 2221, 2237, 2239, 2243, 2251, 2267, 2269, 2273, 2281, 2287, 2293, 2297, 2309, 2311, 2333, 2339, 2341, 2347, 2351, 2357, 2371, 2377, 2381, 2383, 2389, 2393, 2399, 2411, 2417, 2423, 2437, 2441, 2447, 2459, 2467, 2473, 2477, 2503, 2521, 2531, 2539, 2543, 2549, 2551, 2557, 2579, 2591, 2593, 2609, 2617, 2621, 2633, 2647, 2657, 2659, 2663, 2671, 2677, 2683, 2687, 2689, 2693, 2699, 2707, 2711, 2713, 2719, 2729, 2731, 2741, 2749, 2753, 2767, 2777, 2789, 2791, 2797, 2801, 2803, 2819, 2833, 2837, 2843, 2851, 2857, 2861, 2879, 2887, 2897, 2903, 2909, 2917, 2927, 2939, 2953, 2957, 2963, 2969, 2971, 2999, 3001, 3011, 3019, 3023, 3037, 3041, 3049, 3061, 3067, 3079, 3083, 3089, 3109, 3119, 3121, 3137, 3163, 3167, 3169, 3181, 3187, 3191, 3203, 3209, 3217, 3221, 3229, 3251, 3253, 3257, 3259, 3271, 3299, 3301, 3307, 3313, 3319, 3323, 3329, 3331, 3343, 3347, 3359, 3361, 3371, 3373, 3389, 3391, 3407, 3413, 3433, 3449, 3457, 3461, 3463, 3467, 3469, 3491, 3499, 3511, 3517, 3527, 3529, 3533, 3539, 3541, 3547, 3557, 3559, 3571, 3581, 3583, 3593, 3607, 3613, 3617, 3623, 3631, 3637, 3643, 3659, 3671, 3673, 3677, 3691, 3697, 3701, 3709, 3719, 3727, 3733, 3739, 3761, 3767, 3769, 3779, 3793, 3797, 3803, 3821, 3823, 3833, 3847, 3851, 3853, 3863, 3877, 3881, 3889, 3907, 3911, 3917, 3919, 3923, 3929, 3931, 3943, 3947, 3967, 3989, 4001, 4003, 4007, 4013, 4019, 4021, 4027, 4049, 4051, 4057, 4073, 4079, 4091, 4093, 4099, 4111, 4127, 4129, 4133, 4139, 4153, 4157, 4159, 4177, 4201, 4211, 4217, 4219, 4229, 4231, 4241, 4243, 4253, 4259, 4261, 4271, 4273, 4283, 4289, 4297, 4327, 4337, 4339, 4349, 4357, 4363, 4373, 4391, 4397, 4409, 4421, 4423, 4441, 4447, 4451, 4457, 4463, 4481, 4483, 4493, 4507, 4513, 4517, 4519, 4523, 4547, 4549, 4561, 4567, 4583, 4591, 4597, 4603, 4621, 4637, 4639, 4643, 4649, 4651, 4657, 4663, 4673, 4679, 4691, 4703, 4721, 4723, 4729, 4733, 4751, 4759, 4783, 4787, 4789, 4793, 4799, 4801, 4813, 4817, 4831, 4861, 4871, 4877, 4889, 4903, 4909, 4919, 4931, 4933, 4937, 4943, 4951, 4957, 4967, 4969, 4973, 4987, 4993, 4999, 5003, 5009, 5011, 5021, 5023, 5039, 5051, 5059, 5077, 5081, 5087, 5099, 5101, 5107, 5113, 5119, 5147, 5153, 5167, 5171, 5179, 5189, 5197, 5209, 5227, 5231, 5233, 5237, 5261, 5273, 5279, 5281, 5297, 5303, 5309, 5323, 5333, 5347, 5351, 5381, 5387, 5393, 5399, 5407, 5413, 5417, 5419, 5431, 5437, 5441, 5443, 5449, 5471, 5477, 5479, 5483, 5501, 5503, 5507, 5519, 5521, 5527, 5531, 5557, 5563, 5569, 5573, 5581, 5591, 5623, 5639, 5641, 5647, 5651, 5653, 5657, 5659, 5669, 5683, 5689, 5693, 5701, 5711, 5717, 5737, 5741, 5743, 5749, 5779, 5783, 5791, 5801, 5807, 5813, 5821, 5827, 5839, 5843, 5849, 5851, 5857, 5861, 5867, 5869, 5879, 5881, 5897, 5903, 5923, 5927, 5939, 5953, 5981, 5987, 6007, 6011, 6029, 6037, 6043, 6047, 6053, 6067, 6073, 6079, 6089, 6091, 6101, 6113, 6121, 6131, 6133, 6143, 6151, 6163, 6173, 6197, 6199, 6203, 6211, 6217, 6221, 6229, 6247, 6257, 6263, 6269, 6271, 6277, 6287, 6299, 6301, 6311, 6317, 6323, 6329, 6337, 6343, 6353, 6359, 6361, 6367, 6373, 6379, 6389, 6397, 6421, 6427, 6449, 6451, 6469, 6473, 6481, 6491, 6521, 6529, 6547, 6551, 6553, 6563, 6569, 6571, 6577, 6581, 6599, 6607, 6619, 6637, 6653, 6659, 6661, 6673, 6679, 6689, 6691, 6701, 6703, 6709, 6719, 6733, 6737, 6761, 6763, 6779, 6781, 6791, 6793, 6803, 6823, 6827, 6829, 6833, 6841, 6857, 6863, 6869, 6871, 6883, 6899, 6907, 6911, 6917, 6947, 6949, 6959, 6961, 6967, 6971, 6977, 6983, 6991, 6997, 7001, 7013, 7019, 7027, 7039, 7043, 7057, 7069, 7079, 7103, 7109, 7121, 7127, 7129, 7151, 7159, 7177, 7187, 7193, 7207, 7211, 7213, 7219, 7229, 7237, 7243, 7247, 7253, 7283, 7297, 7307, 7309, 7321, 7331, 7333, 7349, 7351, 7369, 7393, 7411, 7417, 7433, 7451, 7457, 7459, 7477, 7481, 7487, 7489, 7499, 7507, 7517, 7523, 7529, 7537, 7541, 7547, 7549, 7559, 7561, 7573, 7577, 7583, 7589, 7591, 7603, 7607, 7621, 7639, 7643, 7649, 7669, 7673, 7681, 7687, 7691, 7699, 7703, 7717, 7723, 7727, 7741, 7753, 7757, 7759, 7789, 7793, 7817, 7823, 7829, 7841, 7853, 7867, 7873, 7877, 7879, 7883, 7901, 7907, 7919, 7927, 7933, 7937, 7949, 7951, 7963, 7993, 8009, 8011, 8017, 8039, 8053, 8059, 8069, 8081, 8087, 8089, 8093, 8101, 8111, 8117, 8123, 8147, 8161, 8167, 8171, 8179, 8191, 8209, 8219, 8221, 8231, 8233, 8237, 8243, 8263, 8269, 8273, 8287, 8291, 8293, 8297, 8311, 8317, 8329, 8353, 8363, 8369, 8377, 8387, 8389, 8419, 8423, 8429, 8431, 8443, 8447, 8461, 8467, 8501, 8513, 8521, 8527, 8537, 8539, 8543, 8563, 8573, 8581, 8597, 8599, 8609, 8623, 8627, 8629, 8641, 8647, 8663, 8669, 8677, 8681, 8689, 8693, 8699, 8707, 8713, 8719, 8731, 8737, 8741, 8747, 8753, 8761, 8779, 8783, 8803, 8807, 8819, 8821, 8831, 8837, 8839, 8849, 8861, 8863, 8867, 8887, 8893, 8923, 8929, 8933, 8941, 8951, 8963, 8969, 8971, 8999, 9001, 9007, 9011, 9013, 9029, 9041, 9043, 9049, 9059, 9067, 9091, 9103, 9109, 9127, 9133, 9137, 9151, 9157, 9161, 9173, 9181, 9187, 9199, 9203, 9209, 9221, 9227, 9239, 9241, 9257, 9277, 9281, 9283, 9293, 9311, 9319, 9323, 9337, 9341, 9343, 9349, 9371, 9377, 9391, 9397, 9403, 9413, 9419, 9421, 9431, 9433, 9437, 9439, 9461, 9463, 9467, 9473, 9479, 9491, 9497, 9511, 9521, 9533, 9539, 9547, 9551, 9587, 9601, 9613, 9619, 9623, 9629, 9631, 9643, 9649, 9661, 9677, 9679, 9689, 9697, 9719, 9721, 9733, 9739, 9743, 9749, 9767, 9769, 9781, 9787, 9791, 9803, 9811, 9817, 9829, 9833, 9839, 9851, 9857, 9859, 9871, 9883, 9887, 9901, 9907, 9923, 9929, 9931, 9941, 9949, 9967, 9973, 10007, 10009, 10037, 10039, 10061, 10067, 10069, 10079, 10091, 10093, 10099, 10103, 10111, 10133, 10139, 10141, 10151, 10159, 10163, 10169, 10177, 10181, 10193, 10211, 10223, 10243, 10247, 10253, 10259, 10267, 10271, 10273, 10289, 10301, 10303, 10313, 10321, 10331, 10333, 10337, 10343, 10357, 10369, 10391, 10399, 10427, 10429, 10433, 10453, 10457, 10459, 10463, 10477, 10487, 10499, 10501, 10513, 10529, 10531, 10559, 10567, 10589, 10597, 10601, 10607, 10613, 10627, 10631, 10639, 10651, 10657, 10663, 10667, 10687, 10691, 10709, 10711, 10723, 10729, 10733, 10739, 10753, 10771, 10781, 10789, 10799, 10831, 10837, 10847, 10853, 10859, 10861, 10867, 10883, 10889, 10891, 10903, 10909, 10937, 10939, 10949, 10957, 10973, 10979, 10987, 10993, 11003, 11027, 11047, 11057, 11059, 11069, 11071, 11083, 11087, 11093, 11113, 11117, 11119, 11131, 11149, 11159, 11161, 11171, 11173, 11177, 11197, 11213, 11239, 11243, 11251, 11257, 11261, 11273, 11279, 11287, 11299, 11311, 11317, 11321, 11329, 11351, 11353, 11369, 11383, 11393, 11399, 11411, 11423, 11437, 11443, 11447, 11467, 11471, 11483, 11489, 11491, 11497, 11503, 11519, 11527, 11549, 11551, 11579, 11587, 11593, 11597, 11617, 11621, 11633, 11657, 11677, 11681, 11689, 11699, 11701, 11717, 11719, 11731, 11743, 11777, 11779, 11783, 11789, 11801, 11807, 11813, 11821, 11827, 11831, 11833, 11839, 11863, 11867, 11887, 11897, 11903, 11909, 11923, 11927, 11933, 11939, 11941, 11953, 11959, 11969, 11971, 11981, 11987, 12007, 12011, 12037, 12041, 12043, 12049, 12071, 12073, 12097, 12101, 12107, 12109, 12113, 12119, 12143, 12149, 12157, 12161, 12163, 12197, 12203, 12211, 12227, 12239, 12241, 12251, 12253, 12263, 12269, 12277, 12281, 12289, 12301, 12323, 12329, 12343, 12347, 12373, 12377, 12379, 12391, 12401, 12409, 12413, 12421, 12433, 12437, 12451, 12457, 12473, 12479, 12487, 12491, 12497, 12503, 12511, 12517, 12527, 12539, 12541, 12547, 12553, 12569, 12577, 12583, 12589, 12601, 12611, 12613, 12619, 12637, 12641, 12647, 12653, 12659, 12671, 12689, 12697, 12703, 12713, 12721, 12739, 12743, 12757, 12763, 12781, 12791, 12799, 12809, 12821, 12823, 12829, 12841, 12853, 12889, 12893, 12899, 12907, 12911, 12917, 12919, 12923, 12941, 12953, 12959, 12967, 12973, 12979, 12983, 13001, 13003, 13007, 13009, 13033, 13037, 13043, 13049, 13063, 13093, 13099, 13103, 13109, 13121, 13127, 13147, 13151, 13159, 13163, 13171, 13177, 13183, 13187, 13217, 13219, 13229, 13241, 13249, 13259, 13267, 13291, 13297, 13309, 13313, 13327, 13331, 13337, 13339, 13367, 13381, 13397, 13399, 13411, 13417, 13421, 13441, 13451, 13457, 13463, 13469, 13477, 13487, 13499, 13513, 13523, 13537, 13553, 13567, 13577, 13591, 13597, 13613, 13619, 13627, 13633, 13649, 13669, 13679, 13681, 13687, 13691, 13693, 13697, 13709, 13711, 13721, 13723, 13729, 13751, 13757, 13759, 13763, 13781, 13789, 13799, 13807, 13829, 13831, 13841, 13859, 13873, 13877, 13879, 13883, 13901, 13903, 13907, 13913, 13921, 13931, 13933, 13963, 13967, 13997, 13999, 14009, 14011, 14029, 14033, 14051, 14057, 14071, 14081, 14083, 14087, 14107, 14143, 14149, 14153, 14159, 14173, 14177, 14197, 14207, 14221, 14243, 14249, 14251, 14281, 14293, 14303, 14321, 14323, 14327, 14341, 14347, 14369, 14387, 14389, 14401, 14407, 14411, 14419, 14423, 14431, 14437, 14447, 14449, 14461, 14479, 14489, 14503, 14519, 14533, 14537, 14543, 14549, 14551, 14557, 14561, 14563, 14591, 14593, 14621, 14627, 14629, 14633, 14639, 14653, 14657, 14669, 14683, 14699, 14713, 14717, 14723, 14731, 14737, 14741, 14747, 14753, 14759, 14767, 14771, 14779, 14783, 14797, 14813, 14821, 14827, 14831, 14843, 14851, 14867, 14869, 14879, 14887, 14891, 14897, 14923, 14929, 14939, 14947, 14951, 14957, 14969, 14983, 15013, 15017, 15031, 15053, 15061, 15073, 15077, 15083, 15091, 15101, 15107, 15121, 15131, 15137, 15139, 15149, 15161, 15173, 15187, 15193, 15199, 15217, 15227, 15233, 15241, 15259, 15263, 15269, 15271, 15277, 15287, 15289, 15299, 15307, 15313, 15319, 15329, 15331, 15349, 15359, 15361, 15373, 15377, 15383, 15391, 15401, 15413, 15427, 15439, 15443, 15451, 15461, 15467, 15473, 15493, 15497, 15511, 15527, 15541, 15551, 15559, 15569, 15581, 15583, 15601, 15607, 15619, 15629, 15641, 15643, 15647, 15649, 15661, 15667, 15671, 15679, 15683, 15727, 15731, 15733, 15737, 15739, 15749, 15761, 15767, 15773, 15787, 15791, 15797, 15803, 15809, 15817, 15823, 15859, 15877, 15881, 15887, 15889, 15901, 15907, 15913, 15919, 15923, 15937, 15959, 15971, 15973, 15991, 16001, 16007, 16033, 16057, 16061, 16063, 16067, 16069, 16073, 16087, 16091, 16097, 16103, 16111, 16127, 16139, 16141, 16183, 16187, 16189, 16193, 16217, 16223, 16229, 16231, 16249, 16253, 16267, 16273, 16301, 16319, 16333, 16339, 16349, 16361, 16363, 16369, 16381, 16411, 16417, 16421, 16427, 16433, 16447, 16451, 16453, 16477, 16481, 16487, 16493, 16519, 16529, 16547, 16553, 16561, 16567, 16573, 16603, 16607, 16619, 16631, 16633, 16649, 16651, 16657, 16661, 16673, 16691, 16693, 16699, 16703, 16729, 16741, 16747, 16759, 16763, 16787, 16811, 16823, 16829, 16831, 16843, 16871, 16879, 16883, 16889, 16901, 16903, 16921, 16927, 16931, 16937, 16943, 16963, 16979, 16981, 16987, 16993, 17011, 17021, 17027, 17029, 17033, 17041, 17047, 17053, 17077, 17093, 17099, 17107, 17117, 17123, 17137, 17159, 17167, 17183, 17189, 17191, 17203, 17207, 17209, 17231, 17239, 17257, 17291, 17293, 17299, 17317, 17321, 17327, 17333, 17341, 17351, 17359, 17377, 17383, 17387, 17389, 17393, 17401, 17417, 17419, 17431, 17443, 17449, 17467, 17471, 17477, 17483, 17489, 17491, 17497, 17509, 17519, 17539, 17551, 17569, 17573, 17579, 17581, 17597, 17599, 17609, 17623, 17627, 17657, 17659, 17669, 17681, 17683, 17707, 17713, 17729, 17737, 17747, 17749, 17761, 17783, 17789, 17791, 17807, 17827, 17837, 17839, 17851, 17863, 17881, 17891, 17903, 17909, 17911, 17921, 17923, 17929, 17939, 17957, 17959, 17971, 17977, 17981, 17987, 17989, 18013, 18041, 18043, 18047, 18049, 18059, 18061, 18077, 18089, 18097, 18119, 18121, 18127, 18131, 18133, 18143, 18149, 18169, 18181, 18191, 18199, 18211, 18217, 18223, 18229, 18233, 18251, 18253, 18257, 18269, 18287, 18289, 18301, 18307, 18311, 18313, 18329, 18341, 18353, 18367, 18371, 18379, 18397, 18401, 18413, 18427, 18433, 18439, 18443, 18451, 18457, 18461, 18481, 18493, 18503, 18517, 18521, 18523, 18539, 18541, 18553, 18583, 18587, 18593, 18617, 18637, 18661, 18671, 18679, 18691, 18701, 18713, 18719, 18731, 18743, 18749, 18757, 18773, 18787, 18793, 18797, 18803, 18839, 18859, 18869, 18899, 18911, 18913, 18917, 18919, 18947, 18959, 18973, 18979, 19001, 19009, 19013, 19031, 19037, 19051, 19069, 19073, 19079, 19081, 19087, 19121, 19139, 19141, 19157, 19163, 19181, 19183, 19207, 19211, 19213, 19219, 19231, 19237, 19249, 19259, 19267, 19273, 19289, 19301, 19309, 19319, 19333, 19373, 19379, 19381, 19387, 19391, 19403, 19417, 19421, 19423, 19427, 19429, 19433, 19441, 19447, 19457, 19463, 19469, 19471, 19477, 19483, 19489, 19501, 19507, 19531, 19541, 19543, 19553, 19559, 19571, 19577, 19583, 19597, 19603, 19609, 19661, 19681, 19687, 19697, 19699, 19709, 19717, 19727, 19739, 19751, 19753, 19759, 19763, 19777, 19793, 19801, 19813, 19819, 19841, 19843, 19853, 19861, 19867, 19889, 19891, 19913, 19919, 19927, 19937, 19949, 19961, 19963, 19973, 19979, 19991, 19993, 19997, 20011, 20021, 20023, 20029, 20047, 20051, 20063, 20071, 20089, 20101, 20107, 20113, 20117, 20123, 20129, 20143, 20147, 20149, 20161, 20173, 20177, 20183, 20201, 20219, 20231, 20233, 20249, 20261, 20269, 20287, 20297, 20323, 20327, 20333, 20341, 20347, 20353, 20357, 20359, 20369, 20389, 20393, 20399, 20407, 20411, 20431, 20441, 20443, 20477, 20479, 20483, 20507, 20509, 20521, 20533, 20543, 20549, 20551, 20563, 20593, 20599, 20611, 20627, 20639, 20641, 20663, 20681, 20693, 20707, 20717, 20719, 20731, 20743, 20747, 20749, 20753, 20759, 20771, 20773, 20789, 20807, 20809, 20849, 20857, 20873, 20879, 20887, 20897, 20899, 20903, 20921, 20929, 20939, 20947, 20959, 20963, 20981, 20983, 21001, 21011, 21013, 21017, 21019, 21023, 21031, 21059, 21061, 21067, 21089, 21101, 21107, 21121, 21139, 21143, 21149, 21157, 21163, 21169, 21179, 21187, 21191, 21193, 21211, 21221, 21227, 21247, 21269, 21277, 21283, 21313, 21317, 21319, 21323, 21341, 21347, 21377, 21379, 21383, 21391, 21397, 21401, 21407, 21419, 21433, 21467, 21481, 21487, 21491, 21493, 21499, 21503, 21517, 21521, 21523, 21529, 21557, 21559, 21563, 21569, 21577, 21587, 21589, 21599, 21601, 21611, 21613, 21617, 21647, 21649, 21661, 21673, 21683, 21701, 21713, 21727, 21737, 21739, 21751, 21757, 21767, 21773, 21787, 21799, 21803, 21817, 21821, 21839, 21841, 21851, 21859, 21863, 21871, 21881, 21893, 21911, 21929, 21937, 21943, 21961, 21977, 21991, 21997, 22003, 22013, 22027, 22031, 22037, 22039, 22051, 22063, 22067, 22073, 22079, 22091, 22093, 22109, 22111, 22123, 22129, 22133, 22147, 22153, 22157, 22159, 22171, 22189, 22193, 22229, 22247, 22259, 22271, 22273, 22277, 22279, 22283, 22291, 22303, 22307, 22343, 22349, 22367, 22369, 22381, 22391, 22397, 22409, 22433, 22441, 22447, 22453, 22469, 22481, 22483, 22501, 22511, 22531, 22541, 22543, 22549, 22567, 22571, 22573, 22613, 22619, 22621, 22637, 22639, 22643, 22651, 22669, 22679, 22691, 22697, 22699, 22709, 22717, 22721, 22727, 22739, 22741, 22751, 22769, 22777, 22783, 22787, 22807, 22811, 22817, 22853, 22859, 22861, 22871, 22877, 22901, 22907, 22921, 22937, 22943, 22961, 22963, 22973, 22993, 23003, 23011, 23017, 23021, 23027, 23029, 23039, 23041, 23053, 23057, 23059, 23063, 23071, 23081, 23087, 23099, 23117, 23131, 23143, 23159, 23167, 23173, 23189, 23197, 23201, 23203, 23209, 23227, 23251, 23269, 23279, 23291, 23293, 23297, 23311, 23321, 23327, 23333, 23339, 23357, 23369, 23371, 23399, 23417, 23431, 23447, 23459, 23473, 23497, 23509, 23531, 23537, 23539, 23549, 23557, 23561, 23563, 23567, 23581, 23593, 23599, 23603, 23609, 23623, 23627, 23629, 23633, 23663, 23669, 23671, 23677, 23687, 23689, 23719, 23741, 23743, 23747, 23753, 23761, 23767, 23773, 23789, 23801, 23813, 23819, 23827, 23831, 23833, 23857, 23869, 23873, 23879, 23887, 23893, 23899, 23909, 23911, 23917, 23929, 23957, 23971, 23977, 23981, 23993, 24001, 24007, 24019, 24023, 24029, 24043, 24049, 24061, 24071, 24077, 24083, 24091, 24097, 24103, 24107, 24109, 24113, 24121, 24133, 24137, 24151, 24169, 24179, 24181, 24197, 24203, 24223, 24229, 24239, 24247, 24251, 24281, 24317, 24329, 24337, 24359, 24371, 24373, 24379, 24391, 24407, 24413, 24419, 24421, 24439, 24443, 24469, 24473, 24481, 24499, 24509, 24517, 24527, 24533, 24547, 24551, 24571, 24593, 24611, 24623, 24631, 24659, 24671, 24677, 24683, 24691, 24697, 24709, 24733, 24749, 24763, 24767, 24781, 24793, 24799, 24809, 24821, 24841, 24847, 24851, 24859, 24877, 24889, 24907, 24917, 24919, 24923, 24943, 24953, 24967, 24971, 24977, 24979, 24989, 25013, 25031, 25033, 25037, 25057, 25073, 25087, 25097, 25111, 25117, 25121, 25127, 25147, 25153, 25163, 25169, 25171, 25183, 25189, 25219, 25229, 25237, 25243, 25247, 25253, 25261, 25301, 25303, 25307, 25309, 25321, 25339, 25343, 25349, 25357, 25367, 25373, 25391, 25409, 25411, 25423, 25439, 25447, 25453, 25457, 25463, 25469, 25471, 25523, 25537, 25541, 25561, 25577, 25579, 25583, 25589, 25601, 25603, 25609, 25621, 25633, 25639, 25643, 25657, 25667, 25673, 25679, 25693, 25703, 25717, 25733, 25741, 25747, 25759, 25763, 25771, 25793, 25799, 25801, 25819, 25841, 25847, 25849, 25867, 25873, 25889, 25903, 25913, 25919, 25931, 25933, 25939, 25943, 25951, 25969, 25981, 25997, 25999, 26003, 26017, 26021, 26029, 26041, 26053, 26083, 26099, 26107, 26111, 26113, 26119, 26141, 26153, 26161, 26171, 26177, 26183, 26189, 26203, 26209, 26227, 26237, 26249, 26251, 26261, 26263, 26267, 26293, 26297, 26309, 26317, 26321, 26339, 26347, 26357, 26371, 26387, 26393, 26399, 26407, 26417, 26423, 26431, 26437, 26449, 26459, 26479, 26489, 26497, 26501, 26513, 26539, 26557, 26561, 26573, 26591, 26597, 26627, 26633, 26641, 26647, 26669, 26681, 26683, 26687, 26693, 26699, 26701, 26711, 26713, 26717, 26723, 26729, 26731, 26737, 26759, 26777, 26783, 26801, 26813, 26821, 26833, 26839, 26849, 26861, 26863, 26879, 26881, 26891, 26893, 26903, 26921, 26927, 26947, 26951, 26953, 26959, 26981, 26987, 26993, 27011, 27017, 27031, 27043, 27059, 27061, 27067, 27073, 27077, 27091, 27103, 27107, 27109, 27127, 27143, 27179, 27191, 27197, 27211, 27239, 27241, 27253, 27259, 27271, 27277, 27281, 27283, 27299, 27329, 27337, 27361, 27367, 27397, 27407, 27409, 27427, 27431, 27437, 27449, 27457, 27479, 27481, 27487, 27509, 27527, 27529, 27539, 27541, 27551, 27581, 27583, 27611, 27617, 27631, 27647, 27653, 27673, 27689, 27691, 27697, 27701, 27733, 27737, 27739, 27743, 27749, 27751, 27763, 27767, 27773, 27779, 27791, 27793, 27799, 27803, 27809, 27817, 27823, 27827, 27847, 27851, 27883, 27893, 27901, 27917, 27919, 27941, 27943, 27947, 27953, 27961, 27967, 27983, 27997, 28001, 28019, 28027, 28031, 28051, 28057, 28069, 28081, 28087, 28097, 28099, 28109, 28111, 28123, 28151, 28163, 28181, 28183, 28201, 28211, 28219, 28229, 28277, 28279, 28283, 28289, 28297, 28307, 28309, 28319, 28349, 28351, 28387, 28393, 28403, 28409, 28411, 28429, 28433, 28439, 28447, 28463, 28477, 28493, 28499, 28513, 28517, 28537, 28541, 28547, 28549, 28559, 28571, 28573, 28579, 28591, 28597, 28603, 28607, 28619, 28621, 28627, 28631, 28643, 28649, 28657, 28661, 28663, 28669, 28687, 28697, 28703, 28711, 28723, 28729, 28751, 28753, 28759, 28771, 28789, 28793, 28807, 28813, 28817, 28837, 28843, 28859, 28867, 28871, 28879, 28901, 28909, 28921, 28927, 28933, 28949, 28961, 28979, 29009, 29017, 29021, 29023, 29027, 29033, 29059, 29063, 29077, 29101, 29123, 29129, 29131, 29137, 29147, 29153, 29167, 29173, 29179, 29191, 29201, 29207, 29209, 29221, 29231, 29243, 29251, 29269, 29287, 29297, 29303, 29311, 29327, 29333, 29339, 29347, 29363, 29383, 29387, 29389, 29399, 29401, 29411, 29423, 29429, 29437, 29443, 29453, 29473, 29483, 29501, 29527, 29531, 29537, 29567, 29569, 29573, 29581, 29587, 29599, 29611, 29629, 29633, 29641, 29663, 29669, 29671, 29683, 29717, 29723, 29741, 29753, 29759, 29761, 29789, 29803, 29819, 29833, 29837, 29851, 29863, 29867, 29873, 29879, 29881, 29917, 29921, 29927, 29947, 29959, 29983, 29989, 30011, 30013, 30029, 30047, 30059, 30071, 30089, 30091, 30097, 30103, 30109, 30113, 30119, 30133, 30137, 30139, 30161, 30169, 30181, 30187, 30197, 30203, 30211, 30223, 30241, 30253, 30259, 30269, 30271, 30293, 30307, 30313, 30319, 30323, 30341, 30347, 30367, 30389, 30391, 30403, 30427, 30431, 30449, 30467, 30469, 30491, 30493, 30497, 30509, 30517, 30529, 30539, 30553, 30557, 30559, 30577, 30593, 30631, 30637, 30643, 30649, 30661, 30671, 30677, 30689, 30697, 30703, 30707, 30713, 30727, 30757, 30763, 30773, 30781, 30803, 30809, 30817, 30829, 30839, 30841, 30851, 30853, 30859, 30869, 30871, 30881, 30893, 30911, 30931, 30937, 30941, 30949, 30971, 30977, 30983, 31013, 31019, 31033, 31039, 31051, 31063, 31069, 31079, 31081, 31091, 31121, 31123, 31139, 31147, 31151, 31153, 31159, 31177, 31181, 31183, 31189, 31193, 31219, 31223, 31231, 31237, 31247, 31249, 31253, 31259, 31267, 31271, 31277, 31307, 31319, 31321, 31327, 31333, 31337, 31357, 31379, 31387, 31391, 31393, 31397, 31469, 31477, 31481, 31489, 31511, 31513, 31517, 31531, 31541, 31543, 31547, 31567, 31573, 31583, 31601, 31607, 31627, 31643, 31649, 31657, 31663, 31667, 31687, 31699, 31721, 31723, 31727, 31729, 31741, 31751, 31769, 31771, 31793, 31799, 31817, 31847, 31849, 31859, 31873, 31883, 31891, 31907, 31957, 31963, 31973, 31981, 31991, 32003, 32009, 32027, 32029, 32051, 32057, 32059, 32063, 32069, 32077, 32083, 32089, 32099, 32117, 32119, 32141, 32143, 32159, 32173, 32183, 32189, 32191, 32203, 32213, 32233, 32237, 32251, 32257, 32261, 32297, 32299, 32303, 32309, 32321, 32323, 32327, 32341, 32353, 32359, 32363, 32369, 32371, 32377, 32381, 32401, 32411, 32413, 32423, 32429, 32441, 32443, 32467, 32479, 32491, 32497, 32503, 32507, 32531, 32533, 32537, 32561, 32563, 32569, 32573, 32579, 32587, 32603, 32609, 32611, 32621, 32633, 32647, 32653, 32687, 32693, 32707, 32713, 32717, 32719, 32749, 32771, 32779, 32783, 32789, 32797, 32801, 32803, 32831, 32833, 32839, 32843, 32869, 32887, 32909, 32911, 32917, 32933, 32939, 32941, 32957, 32969, 32971, 32983, 32987, 32993, 32999, 33013, 33023, 33029, 33037, 33049, 33053, 33071, 33073, 33083, 33091, 33107, 33113, 33119, 33149, 33151, 33161, 33179, 33181, 33191, 33199, 33203, 33211, 33223, 33247, 33287, 33289, 33301, 33311, 33317, 33329, 33331, 33343, 33347, 33349, 33353, 33359, 33377, 33391, 33403, 33409, 33413, 33427, 33457, 33461, 33469, 33479, 33487, 33493, 33503, 33521, 33529, 33533, 33547, 33563, 33569, 33577, 33581, 33587, 33589, 33599, 33601, 33613, 33617, 33619, 33623, 33629, 33637, 33641, 33647, 33679, 33703, 33713, 33721, 33739, 33749, 33751, 33757, 33767, 33769, 33773, 33791, 33797, 33809, 33811, 33827, 33829, 33851, 33857, 33863, 33871, 33889, 33893, 33911, 33923, 33931, 33937, 33941, 33961, 33967, 33997, 34019, 34031, 34033, 34039, 34057, 34061, 34123, 34127, 34129, 34141, 34147, 34157, 34159, 34171, 34183, 34211, 34213, 34217, 34231, 34253, 34259, 34261, 34267, 34273, 34283, 34297, 34301, 34303, 34313, 34319, 34327, 34337, 34351, 34361, 34367, 34369, 34381, 34403, 34421, 34429, 34439, 34457, 34469, 34471, 34483, 34487, 34499, 34501, 34511, 34513, 34519, 34537, 34543, 34549, 34583, 34589, 34591, 34603, 34607, 34613, 34631, 34649, 34651, 34667, 34673, 34679, 34687, 34693, 34703, 34721, 34729, 34739, 34747, 34757, 34759, 34763, 34781, 34807, 34819, 34841, 34843, 34847, 34849, 34871, 34877, 34883, 34897, 34913, 34919, 34939, 34949, 34961, 34963, 34981, 35023, 35027, 35051, 35053, 35059, 35069, 35081, 35083, 35089, 35099, 35107, 35111, 35117, 35129, 35141, 35149, 35153, 35159, 35171, 35201, 35221, 35227, 35251, 35257, 35267, 35279, 35281, 35291, 35311, 35317, 35323, 35327, 35339, 35353, 35363, 35381, 35393, 35401, 35407, 35419, 35423, 35437, 35447, 35449, 35461, 35491, 35507, 35509, 35521, 35527, 35531, 35533, 35537, 35543, 35569, 35573, 35591, 35593, 35597, 35603, 35617, 35671, 35677, 35729, 35731, 35747, 35753, 35759, 35771, 35797, 35801, 35803, 35809, 35831, 35837, 35839, 35851, 35863, 35869, 35879, 35897, 35899, 35911, 35923, 35933, 35951, 35963, 35969, 35977, 35983, 35993, 35999, 36007, 36011, 36013, 36017, 36037, 36061, 36067, 36073, 36083, 36097, 36107, 36109, 36131, 36137, 36151, 36161, 36187, 36191, 36209, 36217, 36229, 36241, 36251, 36263, 36269, 36277, 36293, 36299, 36307, 36313, 36319, 36341, 36343, 36353, 36373, 36383, 36389, 36433, 36451, 36457, 36467, 36469, 36473, 36479, 36493, 36497, 36523, 36527, 36529, 36541, 36551, 36559, 36563, 36571, 36583, 36587, 36599, 36607, 36629, 36637, 36643, 36653, 36671, 36677, 36683, 36691, 36697, 36709, 36713, 36721, 36739, 36749, 36761, 36767, 36779, 36781, 36787, 36791, 36793, 36809, 36821, 36833, 36847, 36857, 36871, 36877, 36887, 36899, 36901, 36913, 36919, 36923, 36929, 36931, 36943, 36947, 36973, 36979, 36997, 37003, 37013, 37019, 37021, 37039, 37049, 37057, 37061, 37087, 37097, 37117, 37123, 37139, 37159, 37171, 37181, 37189, 37199, 37201, 37217, 37223, 37243, 37253, 37273, 37277, 37307, 37309, 37313, 37321, 37337, 37339, 37357, 37361, 37363, 37369, 37379, 37397, 37409, 37423, 37441, 37447, 37463, 37483, 37489, 37493, 37501, 37507, 37511, 37517, 37529, 37537, 37547, 37549, 37561, 37567, 37571, 37573, 37579, 37589, 37591, 37607, 37619, 37633, 37643, 37649, 37657, 37663, 37691, 37693, 37699, 37717, 37747, 37781, 37783, 37799, 37811, 37813, 37831, 37847, 37853, 37861, 37871, 37879, 37889, 37897, 37907, 37951, 37957, 37963, 37967, 37987, 37991, 37993, 37997, 38011, 38039, 38047, 38053, 38069, 38083, 38113, 38119, 38149, 38153, 38167, 38177, 38183, 38189, 38197, 38201, 38219, 38231, 38237, 38239, 38261, 38273, 38281, 38287, 38299, 38303, 38317, 38321, 38327, 38329, 38333, 38351, 38371, 38377, 38393, 38431, 38447, 38449, 38453, 38459, 38461, 38501, 38543, 38557, 38561, 38567, 38569, 38593, 38603, 38609, 38611, 38629, 38639, 38651, 38653, 38669, 38671, 38677, 38693, 38699, 38707, 38711, 38713, 38723, 38729, 38737, 38747, 38749, 38767, 38783, 38791, 38803, 38821, 38833, 38839, 38851, 38861, 38867, 38873, 38891, 38903, 38917, 38921, 38923, 38933, 38953, 38959, 38971, 38977, 38993, 39019, 39023, 39041, 39043, 39047, 39079, 39089, 39097, 39103, 39107, 39113, 39119, 39133, 39139, 39157, 39161, 39163, 39181, 39191, 39199, 39209, 39217, 39227, 39229, 39233, 39239, 39241, 39251, 39293, 39301, 39313, 39317, 39323, 39341, 39343, 39359, 39367, 39371, 39373, 39383, 39397, 39409, 39419, 39439, 39443, 39451, 39461, 39499, 39503, 39509, 39511, 39521, 39541, 39551, 39563, 39569, 39581, 39607, 39619, 39623, 39631, 39659, 39667, 39671, 39679, 39703, 39709, 39719, 39727, 39733, 39749, 39761, 39769, 39779, 39791, 39799, 39821, 39827, 39829, 39839, 39841, 39847, 39857, 39863, 39869, 39877, 39883, 39887, 39901, 39929, 39937, 39953, 39971, 39979, 39983, 39989, 40009, 40013, 40031, 40037, 40039, 40063, 40087, 40093, 40099, 40111, 40123, 40127, 40129, 40151, 40153, 40163, 40169, 40177, 40189, 40193, 40213, 40231, 40237, 40241, 40253, 40277, 40283, 40289, 40343, 40351, 40357, 40361, 40387, 40423, 40427, 40429, 40433, 40459, 40471, 40483, 40487, 40493, 40499, 40507, 40519, 40529, 40531, 40543, 40559, 40577, 40583, 40591, 40597, 40609, 40627, 40637, 40639, 40693, 40697, 40699, 40709, 40739, 40751, 40759, 40763, 40771, 40787, 40801, 40813, 40819, 40823, 40829, 40841, 40847, 40849, 40853, 40867, 40879, 40883, 40897, 40903, 40927, 40933, 40939, 40949, 40961, 40973, 40993, 41011, 41017, 41023, 41039, 41047, 41051, 41057, 41077, 41081, 41113, 41117, 41131, 41141, 41143, 41149, 41161, 41177, 41179, 41183, 41189, 41201, 41203, 41213, 41221, 41227, 41231, 41233, 41243, 41257, 41263, 41269, 41281, 41299, 41333, 41341, 41351, 41357, 41381, 41387, 41389, 41399, 41411, 41413, 41443, 41453, 41467, 41479, 41491, 41507, 41513, 41519, 41521, 41539, 41543, 41549, 41579, 41593, 41597, 41603, 41609, 41611, 41617, 41621, 41627, 41641, 41647, 41651, 41659, 41669, 41681, 41687, 41719, 41729, 41737, 41759, 41761, 41771, 41777, 41801, 41809, 41813, 41843, 41849, 41851, 41863, 41879, 41887, 41893, 41897, 41903, 41911, 41927, 41941, 41947, 41953, 41957, 41959, 41969, 41981, 41983, 41999, 42013, 42017, 42019, 42023, 42043, 42061, 42071, 42073, 42083, 42089, 42101, 42131, 42139, 42157, 42169, 42179, 42181, 42187, 42193, 42197, 42209, 42221, 42223, 42227, 42239, 42257, 42281, 42283, 42293, 42299, 42307, 42323, 42331, 42337, 42349, 42359, 42373, 42379, 42391, 42397, 42403, 42407, 42409, 42433, 42437, 42443, 42451, 42457, 42461, 42463, 42467, 42473, 42487, 42491, 42499, 42509, 42533, 42557, 42569, 42571, 42577, 42589, 42611, 42641, 42643, 42649, 42667, 42677, 42683, 42689, 42697, 42701, 42703, 42709, 42719, 42727, 42737, 42743, 42751, 42767, 42773, 42787, 42793, 42797, 42821, 42829, 42839, 42841, 42853, 42859, 42863, 42899, 42901, 42923, 42929, 42937, 42943, 42953, 42961, 42967, 42979, 42989, 43003, 43013, 43019, 43037, 43049, 43051, 43063, 43067, 43093, 43103, 43117, 43133, 43151, 43159, 43177, 43189, 43201, 43207, 43223, 43237, 43261, 43271, 43283, 43291, 43313, 43319, 43321, 43331, 43391, 43397, 43399, 43403, 43411, 43427, 43441, 43451, 43457, 43481, 43487, 43499, 43517, 43541, 43543, 43573, 43577, 43579, 43591, 43597, 43607, 43609, 43613, 43627, 43633, 43649, 43651, 43661, 43669, 43691, 43711, 43717, 43721, 43753, 43759, 43777, 43781, 43783, 43787, 43789, 43793, 43801, 43853, 43867, 43889, 43891, 43913, 43933, 43943, 43951, 43961, 43963, 43969, 43973, 43987, 43991, 43997, 44017, 44021, 44027, 44029, 44041, 44053, 44059, 44071, 44087, 44089, 44101, 44111, 44119, 44123, 44129, 44131, 44159, 44171, 44179, 44189, 44201, 44203, 44207, 44221, 44249, 44257, 44263, 44267, 44269, 44273, 44279, 44281, 44293, 44351, 44357, 44371, 44381, 44383, 44389, 44417, 44449, 44453, 44483, 44491, 44497, 44501, 44507, 44519, 44531, 44533, 44537, 44543, 44549, 44563, 44579, 44587, 44617, 44621, 44623, 44633, 44641, 44647, 44651, 44657, 44683, 44687, 44699, 44701, 44711, 44729, 44741, 44753, 44771, 44773, 44777, 44789, 44797, 44809, 44819, 44839, 44843, 44851, 44867, 44879, 44887, 44893, 44909, 44917, 44927, 44939, 44953, 44959, 44963, 44971, 44983, 44987, 45007, 45013, 45053, 45061, 45077, 45083, 45119, 45121, 45127, 45131, 45137, 45139, 45161, 45179, 45181, 45191, 45197, 45233, 45247, 45259, 45263, 45281, 45289, 45293, 45307, 45317, 45319, 45329, 45337, 45341, 45343, 45361, 45377, 45389, 45403, 45413, 45427, 45433, 45439, 45481, 45491, 45497, 45503, 45523, 45533, 45541, 45553, 45557, 45569, 45587, 45589, 45599, 45613, 45631, 45641, 45659, 45667, 45673, 45677, 45691, 45697, 45707, 45737, 45751, 45757, 45763, 45767, 45779, 45817, 45821, 45823, 45827, 45833, 45841, 45853, 45863, 45869, 45887, 45893, 45943, 45949, 45953, 45959, 45971, 45979, 45989, 46021, 46027, 46049, 46051, 46061, 46073, 46091, 46093, 46099, 46103, 46133, 46141, 46147, 46153, 46171, 46181, 46183, 46187, 46199, 46219, 46229, 46237, 46261, 46271, 46273, 46279, 46301, 46307, 46309, 46327, 46337, 46349, 46351, 46381, 46399, 46411, 46439, 46441, 46447, 46451, 46457, 46471, 46477, 46489, 46499, 46507, 46511, 46523, 46549, 46559, 46567, 46573, 46589, 46591, 46601, 46619, 46633, 46639, 46643, 46649, 46663, 46679, 46681, 46687, 46691, 46703, 46723, 46727, 46747, 46751, 46757, 46769, 46771, 46807, 46811, 46817, 46819, 46829, 46831, 46853, 46861, 46867, 46877, 46889, 46901, 46919, 46933, 46957, 46993, 46997, 47017, 47041, 47051, 47057, 47059, 47087, 47093, 47111, 47119, 47123, 47129, 47137, 47143, 47147, 47149, 47161, 47189, 47207, 47221, 47237, 47251, 47269, 47279, 47287, 47293, 47297, 47303, 47309, 47317, 47339, 47351, 47353, 47363, 47381, 47387, 47389, 47407, 47417, 47419, 47431, 47441, 47459, 47491, 47497, 47501, 47507, 47513, 47521, 47527, 47533, 47543, 47563, 47569, 47581, 47591, 47599, 47609, 47623, 47629, 47639, 47653, 47657, 47659, 47681, 47699, 47701, 47711, 47713, 47717, 47737, 47741, 47743, 47777, 47779, 47791, 47797, 47807, 47809, 47819, 47837, 47843, 47857, 47869, 47881, 47903, 47911, 47917, 47933, 47939, 47947, 47951, 47963, 47969, 47977, 47981, 48017, 48023, 48029, 48049, 48073, 48079, 48091, 48109, 48119, 48121, 48131, 48157, 48163, 48179, 48187, 48193, 48197, 48221, 48239, 48247, 48259, 48271, 48281, 48299, 48311, 48313, 48337, 48341, 48353, 48371, 48383, 48397, 48407, 48409, 48413, 48437, 48449, 48463, 48473, 48479, 48481, 48487, 48491, 48497, 48523, 48527, 48533, 48539, 48541, 48563, 48571, 48589, 48593, 48611, 48619, 48623, 48647, 48649, 48661, 48673, 48677, 48679, 48731, 48733, 48751, 48757, 48761, 48767, 48779, 48781, 48787, 48799, 48809, 48817, 48821, 48823, 48847, 48857, 48859, 48869, 48871, 48883, 48889, 48907, 48947, 48953, 48973, 48989, 48991, 49003, 49009, 49019, 49031, 49033, 49037, 49043, 49057, 49069, 49081, 49103, 49109, 49117, 49121, 49123, 49139, 49157, 49169, 49171, 49177, 49193, 49199, 49201, 49207, 49211, 49223, 49253, 49261, 49277, 49279, 49297, 49307, 49331, 49333, 49339, 49363, 49367, 49369, 49391, 49393, 49409, 49411, 49417, 49429, 49433, 49451, 49459, 49463, 49477, 49481, 49499, 49523, 49529, 49531, 49537, 49547, 49549, 49559, 49597, 49603, 49613, 49627, 49633, 49639, 49663, 49667, 49669, 49681, 49697, 49711, 49727, 49739, 49741, 49747, 49757, 49783, 49787, 49789, 49801, 49807, 49811, 49823, 49831, 49843, 49853, 49871, 49877, 49891, 49919, 49921, 49927, 49937, 49939, 49943, 49957, 49991, 49993, 49999, 50021, 50023, 50033, 50047, 50051, 50053, 50069, 50077, 50087, 50093, 50101, 50111, 50119, 50123, 50129, 50131, 50147, 50153, 50159, 50177, 50207, 50221, 50227, 50231, 50261, 50263, 50273, 50287, 50291, 50311, 50321, 50329, 50333, 50341, 50359, 50363, 50377, 50383, 50387, 50411, 50417, 50423, 50441, 50459, 50461, 50497, 50503, 50513, 50527, 50539, 50543, 50549, 50551, 50581, 50587, 50591, 50593, 50599, 50627, 50647, 50651, 50671, 50683, 50707, 50723, 50741, 50753, 50767, 50773, 50777, 50789, 50821, 50833, 50839, 50849, 50857, 50867, 50873, 50891, 50893, 50909, 50923, 50929, 50951, 50957, 50969, 50971, 50989, 50993, 51001, 51031, 51043, 51047, 51059, 51061, 51071, 51109, 51131, 51133, 51137, 51151, 51157, 51169, 51193, 51197, 51199, 51203, 51217, 51229, 51239, 51241, 51257, 51263, 51283, 51287, 51307, 51329, 51341, 51343, 51347, 51349, 51361, 51383, 51407, 51413, 51419, 51421, 51427, 51431, 51437, 51439, 51449, 51461, 51473, 51479, 51481, 51487, 51503, 51511, 51517, 51521, 51539, 51551, 51563, 51577, 51581, 51593, 51599, 51607, 51613, 51631, 51637, 51647, 51659, 51673, 51679, 51683, 51691, 51713, 51719, 51721, 51749, 51767, 51769, 51787, 51797, 51803, 51817, 51827, 51829, 51839, 51853, 51859, 51869, 51871, 51893, 51899, 51907, 51913, 51929, 51941, 51949, 51971, 51973, 51977, 51991, 52009, 52021, 52027, 52051, 52057, 52067, 52069, 52081, 52103, 52121, 52127, 52147, 52153, 52163, 52177, 52181, 52183, 52189, 52201, 52223, 52237, 52249, 52253, 52259, 52267, 52289, 52291, 52301, 52313, 52321, 52361, 52363, 52369, 52379, 52387, 52391, 52433, 52453, 52457, 52489, 52501, 52511, 52517, 52529, 52541, 52543, 52553, 52561, 52567, 52571, 52579, 52583, 52609, 52627, 52631, 52639, 52667, 52673, 52691, 52697, 52709, 52711, 52721, 52727, 52733, 52747, 52757, 52769, 52783, 52807, 52813, 52817, 52837, 52859, 52861, 52879, 52883, 52889, 52901, 52903, 52919, 52937, 52951, 52957, 52963, 52967, 52973, 52981, 52999, 53003, 53017, 53047, 53051, 53069, 53077, 53087, 53089, 53093, 53101, 53113, 53117, 53129, 53147, 53149, 53161, 53171, 53173, 53189, 53197, 53201, 53231, 53233, 53239, 53267, 53269, 53279, 53281, 53299, 53309, 53323, 53327, 53353, 53359, 53377, 53381, 53401, 53407, 53411, 53419, 53437, 53441, 53453, 53479, 53503, 53507, 53527, 53549, 53551, 53569, 53591, 53593, 53597, 53609, 53611, 53617, 53623, 53629, 53633, 53639, 53653, 53657, 53681, 53693, 53699, 53717, 53719, 53731, 53759, 53773, 53777, 53783, 53791, 53813, 53819, 53831, 53849, 53857, 53861, 53881, 53887, 53891, 53897, 53899, 53917, 53923, 53927, 53939, 53951, 53959, 53987, 53993, 54001, 54011, 54013, 54037, 54049, 54059, 54083, 54091, 54101, 54121, 54133, 54139, 54151, 54163, 54167, 54181, 54193, 54217, 54251, 54269, 54277, 54287, 54293, 54311, 54319, 54323, 54331, 54347, 54361, 54367, 54371, 54377, 54401, 54403, 54409, 54413, 54419, 54421, 54437, 54443, 54449, 54469, 54493, 54497, 54499, 54503, 54517, 54521, 54539, 54541, 54547, 54559, 54563, 54577, 54581, 54583, 54601, 54617, 54623, 54629, 54631, 54647, 54667, 54673, 54679, 54709, 54713, 54721, 54727, 54751, 54767, 54773, 54779, 54787, 54799, 54829, 54833, 54851, 54869, 54877, 54881, 54907, 54917, 54919, 54941, 54949, 54959, 54973, 54979, 54983, 55001, 55009, 55021, 55049, 55051, 55057, 55061, 55073, 55079, 55103, 55109, 55117, 55127, 55147, 55163, 55171, 55201, 55207, 55213, 55217, 55219, 55229, 55243, 55249, 55259, 55291, 55313, 55331, 55333, 55337, 55339, 55343, 55351, 55373, 55381, 55399, 55411, 55439, 55441, 55457, 55469, 55487, 55501, 55511, 55529, 55541, 55547, 55579, 55589, 55603, 55609, 55619, 55621, 55631, 55633, 55639, 55661, 55663, 55667, 55673, 55681, 55691, 55697, 55711, 55717, 55721, 55733, 55763, 55787, 55793, 55799, 55807, 55813, 55817, 55819, 55823, 55829, 55837, 55843, 55849, 55871, 55889, 55897, 55901, 55903, 55921, 55927, 55931, 55933, 55949, 55967, 55987, 55997, 56003, 56009, 56039, 56041, 56053, 56081, 56087, 56093, 56099, 56101, 56113, 56123, 56131, 56149, 56167, 56171, 56179, 56197, 56207, 56209, 56237, 56239, 56249, 56263, 56267, 56269, 56299, 56311, 56333, 56359, 56369, 56377, 56383, 56393, 56401, 56417, 56431, 56437, 56443, 56453, 56467, 56473, 56477, 56479, 56489, 56501, 56503, 56509, 56519, 56527, 56531, 56533, 56543, 56569, 56591, 56597, 56599, 56611, 56629, 56633, 56659, 56663, 56671, 56681, 56687, 56701, 56711, 56713, 56731, 56737, 56747, 56767, 56773, 56779, 56783, 56807, 56809, 56813, 56821, 56827, 56843, 56857, 56873, 56891, 56893, 56897, 56909, 56911, 56921, 56923, 56929, 56941, 56951, 56957, 56963, 56983, 56989, 56993, 56999, 57037, 57041, 57047, 57059, 57073, 57077, 57089, 57097, 57107, 57119, 57131, 57139, 57143, 57149, 57163, 57173, 57179, 57191, 57193, 57203, 57221, 57223, 57241, 57251, 57259, 57269, 57271, 57283, 57287, 57301, 57329, 57331, 57347, 57349, 57367, 57373, 57383, 57389, 57397, 57413, 57427, 57457, 57467, 57487, 57493, 57503, 57527, 57529, 57557, 57559, 57571, 57587, 57593, 57601, 57637, 57641, 57649, 57653, 57667, 57679, 57689, 57697, 57709, 57713, 57719, 57727, 57731, 57737, 57751, 57773, 57781, 57787, 57791, 57793, 57803, 57809, 57829, 57839, 57847, 57853, 57859, 57881, 57899, 57901, 57917, 57923, 57943, 57947, 57973, 57977, 57991, 58013, 58027, 58031, 58043, 58049, 58057, 58061, 58067, 58073, 58099, 58109, 58111, 58129, 58147, 58151, 58153, 58169, 58171, 58189, 58193, 58199, 58207, 58211, 58217, 58229, 58231, 58237, 58243, 58271, 58309, 58313, 58321, 58337, 58363, 58367, 58369, 58379, 58391, 58393, 58403, 58411, 58417, 58427, 58439, 58441, 58451, 58453, 58477, 58481, 58511, 58537, 58543, 58549, 58567, 58573, 58579, 58601, 58603, 58613, 58631, 58657, 58661, 58679, 58687, 58693, 58699, 58711, 58727, 58733, 58741, 58757, 58763, 58771, 58787, 58789, 58831, 58889, 58897, 58901, 58907, 58909, 58913, 58921, 58937, 58943, 58963, 58967, 58979, 58991, 58997, 59009, 59011, 59021, 59023, 59029, 59051, 59053, 59063, 59069, 59077, 59083, 59093, 59107, 59113, 59119, 59123, 59141, 59149, 59159, 59167, 59183, 59197, 59207, 59209, 59219, 59221, 59233, 59239, 59243, 59263, 59273, 59281, 59333, 59341, 59351, 59357, 59359, 59369, 59377, 59387, 59393, 59399, 59407, 59417, 59419, 59441, 59443, 59447, 59453, 59467, 59471, 59473, 59497, 59509, 59513, 59539, 59557, 59561, 59567, 59581, 59611, 59617, 59621, 59627, 59629, 59651, 59659, 59663, 59669, 59671, 59693, 59699, 59707, 59723, 59729, 59743, 59747, 59753, 59771, 59779, 59791, 59797, 59809, 59833, 59863, 59879, 59887, 59921, 59929, 59951, 59957, 59971, 59981, 59999, 60013, 60017, 60029, 60037, 60041, 60077, 60083, 60089, 60091, 60101, 60103, 60107, 60127, 60133, 60139, 60149, 60161, 60167, 60169, 60209, 60217, 60223, 60251, 60257, 60259, 60271, 60289, 60293, 60317, 60331, 60337, 60343, 60353, 60373, 60383, 60397, 60413, 60427, 60443, 60449, 60457, 60493, 60497, 60509, 60521, 60527, 60539, 60589, 60601, 60607, 60611, 60617, 60623, 60631, 60637, 60647, 60649, 60659, 60661, 60679, 60689, 60703, 60719, 60727, 60733, 60737, 60757, 60761, 60763, 60773, 60779, 60793, 60811, 60821, 60859, 60869, 60887, 60889, 60899, 60901, 60913, 60917, 60919, 60923, 60937, 60943, 60953, 60961, 61001, 61007, 61027, 61031, 61043, 61051, 61057, 61091, 61099, 61121, 61129, 61141, 61151, 61153, 61169, 61211, 61223, 61231, 61253, 61261, 61283, 61291, 61297, 61331, 61333, 61339, 61343, 61357, 61363, 61379, 61381, 61403, 61409, 61417, 61441, 61463, 61469, 61471, 61483, 61487, 61493, 61507, 61511, 61519, 61543, 61547, 61553, 61559, 61561, 61583, 61603, 61609, 61613, 61627, 61631, 61637, 61643, 61651, 61657, 61667, 61673, 61681, 61687, 61703, 61717, 61723, 61729, 61751, 61757, 61781, 61813, 61819, 61837, 61843, 61861, 61871, 61879, 61909, 61927, 61933, 61949, 61961, 61967, 61979, 61981, 61987, 61991, 62003, 62011, 62017, 62039, 62047, 62053, 62057, 62071, 62081, 62099, 62119, 62129, 62131, 62137, 62141, 62143, 62171, 62189, 62191, 62201, 62207, 62213, 62219, 62233, 62273, 62297, 62299, 62303, 62311, 62323, 62327, 62347, 62351, 62383, 62401, 62417, 62423, 62459, 62467, 62473, 62477, 62483, 62497, 62501, 62507, 62533, 62539, 62549, 62563, 62581, 62591, 62597, 62603, 62617, 62627, 62633, 62639, 62653, 62659, 62683, 62687, 62701, 62723, 62731, 62743, 62753, 62761, 62773, 62791, 62801, 62819, 62827, 62851, 62861, 62869, 62873, 62897, 62903, 62921, 62927, 62929, 62939, 62969, 62971, 62981, 62983, 62987, 62989, 63029, 63031, 63059, 63067, 63073, 63079, 63097, 63103, 63113, 63127, 63131, 63149, 63179, 63197, 63199, 63211, 63241, 63247, 63277, 63281, 63299, 63311, 63313, 63317, 63331, 63337, 63347, 63353, 63361, 63367, 63377, 63389, 63391, 63397, 63409, 63419, 63421, 63439, 63443, 63463, 63467, 63473, 63487, 63493, 63499, 63521, 63527, 63533, 63541, 63559, 63577, 63587, 63589, 63599, 63601, 63607, 63611, 63617, 63629, 63647, 63649, 63659, 63667, 63671, 63689, 63691, 63697, 63703, 63709, 63719, 63727, 63737, 63743, 63761, 63773, 63781, 63793, 63799, 63803, 63809, 63823, 63839, 63841, 63853, 63857, 63863, 63901, 63907, 63913, 63929, 63949, 63977, 63997, 64007, 64013, 64019, 64033, 64037, 64063, 64067, 64081, 64091, 64109, 64123, 64151, 64153, 64157, 64171, 64187, 64189, 64217, 64223, 64231, 64237, 64271, 64279, 64283, 64301, 64303, 64319, 64327, 64333, 64373, 64381, 64399, 64403, 64433, 64439, 64451, 64453, 64483, 64489, 64499, 64513, 64553, 64567, 64577, 64579, 64591, 64601, 64609, 64613, 64621, 64627, 64633, 64661, 64663, 64667, 64679, 64693, 64709, 64717, 64747, 64763, 64781, 64783, 64793, 64811, 64817, 64849, 64853, 64871, 64877, 64879, 64891, 64901, 64919, 64921, 64927, 64937, 64951, 64969, 64997, 65003, 65011, 65027, 65029, 65033, 65053, 65063, 65071, 65089, 65099, 65101, 65111, 65119, 65123, 65129, 65141, 65147, 65167, 65171, 65173, 65179, 65183, 65203, 65213, 65239, 65257, 65267, 65269, 65287, 65293, 65309, 65323, 65327, 65353, 65357, 65371, 65381, 65393, 65407, 65413, 65419, 65423, 65437, 65447, 65449, 65479, 65497, 65519, 65521, 65537, 65539, 65543, 65551, 65557, 65563, 65579, 65581, 65587, 65599, 65609, 65617, 65629, 65633, 65647, 65651, 65657, 65677, 65687, 65699, 65701, 65707, 65713, 65717, 65719, 65729, 65731, 65761, 65777, 65789, 65809, 65827, 65831, 65837, 65839, 65843, 65851, 65867, 65881, 65899, 65921, 65927, 65929, 65951, 65957, 65963, 65981, 65983, 65993, 66029, 66037, 66041, 66047, 66067, 66071, 66083, 66089, 66103, 66107, 66109, 66137, 66161, 66169, 66173, 66179, 66191, 66221, 66239, 66271, 66293, 66301, 66337, 66343, 66347, 66359, 66361, 66373, 66377, 66383, 66403, 66413, 66431, 66449, 66457, 66463, 66467, 66491, 66499, 66509, 66523, 66529, 66533, 66541, 66553, 66569, 66571, 66587, 66593, 66601, 66617, 66629, 66643, 66653, 66683, 66697, 66701, 66713, 66721, 66733, 66739, 66749, 66751, 66763, 66791, 66797, 66809, 66821, 66841, 66851, 66853, 66863, 66877, 66883, 66889, 66919, 66923, 66931, 66943, 66947, 66949, 66959, 66973, 66977, 67003, 67021, 67033, 67043, 67049, 67057, 67061, 67073, 67079, 67103, 67121, 67129, 67139, 67141, 67153, 67157, 67169, 67181, 67187, 67189, 67211, 67213, 67217, 67219, 67231, 67247, 67261, 67271, 67273, 67289, 67307, 67339, 67343, 67349, 67369, 67391, 67399, 67409, 67411, 67421, 67427, 67429, 67433, 67447, 67453, 67477, 67481, 67489, 67493, 67499, 67511, 67523, 67531, 67537, 67547, 67559, 67567, 67577, 67579, 67589, 67601, 67607, 67619, 67631, 67651, 67679, 67699, 67709, 67723, 67733, 67741, 67751, 67757, 67759, 67763, 67777, 67783, 67789, 67801, 67807, 67819, 67829, 67843, 67853, 67867, 67883, 67891, 67901, 67927, 67931, 67933, 67939, 67943, 67957, 67961, 67967, 67979, 67987, 67993, 68023, 68041, 68053, 68059, 68071, 68087, 68099, 68111, 68113, 68141, 68147, 68161, 68171, 68207, 68209, 68213, 68219, 68227, 68239, 68261, 68279, 68281, 68311, 68329, 68351, 68371, 68389, 68399, 68437, 68443, 68447, 68449, 68473, 68477, 68483, 68489, 68491, 68501, 68507, 68521, 68531, 68539, 68543, 68567, 68581, 68597, 68611, 68633, 68639, 68659, 68669, 68683, 68687, 68699, 68711, 68713, 68729, 68737, 68743, 68749, 68767, 68771, 68777, 68791, 68813, 68819, 68821, 68863, 68879, 68881, 68891, 68897, 68899, 68903, 68909, 68917, 68927, 68947, 68963, 68993, 69001, 69011, 69019, 69029, 69031, 69061, 69067, 69073, 69109, 69119, 69127, 69143, 69149, 69151, 69163, 69191, 69193, 69197, 69203, 69221, 69233, 69239, 69247, 69257, 69259, 69263, 69313, 69317, 69337, 69341, 69371, 69379, 69383, 69389, 69401, 69403, 69427, 69431, 69439, 69457, 69463, 69467, 69473, 69481, 69491, 69493, 69497, 69499, 69539, 69557, 69593, 69623, 69653, 69661, 69677, 69691, 69697, 69709, 69737, 69739, 69761, 69763, 69767, 69779, 69809, 69821, 69827, 69829, 69833, 69847, 69857, 69859, 69877, 69899, 69911, 69929, 69931, 69941, 69959, 69991, 69997, 70001, 70003, 70009, 70019, 70039, 70051, 70061, 70067, 70079, 70099, 70111, 70117, 70121, 70123, 70139, 70141, 70157, 70163, 70177, 70181, 70183, 70199, 70201, 70207, 70223, 70229, 70237, 70241, 70249, 70271, 70289, 70297, 70309, 70313, 70321, 70327, 70351, 70373, 70379, 70381, 70393, 70423, 70429, 70439, 70451, 70457, 70459, 70481, 70487, 70489, 70501, 70507, 70529, 70537, 70549, 70571, 70573, 70583, 70589, 70607, 70619, 70621, 70627, 70639, 70657, 70663, 70667, 70687, 70709, 70717, 70729, 70753, 70769, 70783, 70793, 70823, 70841, 70843, 70849, 70853, 70867, 70877, 70879, 70891, 70901, 70913, 70919, 70921, 70937, 70949, 70951, 70957, 70969, 70979, 70981, 70991, 70997, 70999, 71011, 71023, 71039, 71059, 71069, 71081, 71089, 71119, 71129, 71143, 71147, 71153, 71161, 71167, 71171, 71191, 71209, 71233, 71237, 71249, 71257, 71261, 71263, 71287, 71293, 71317, 71327, 71329, 71333, 71339, 71341, 71347, 71353, 71359, 71363, 71387, 71389, 71399, 71411, 71413, 71419, 71429, 71437, 71443, 71453, 71471, 71473, 71479, 71483, 71503, 71527, 71537, 71549, 71551, 71563, 71569, 71593, 71597, 71633, 71647, 71663, 71671, 71693, 71699, 71707, 71711, 71713, 71719, 71741, 71761, 71777, 71789, 71807, 71809, 71821, 71837, 71843, 71849, 71861, 71867, 71879, 71881, 71887, 71899, 71909, 71917, 71933, 71941, 71947, 71963, 71971, 71983, 71987, 71993, 71999, 72019, 72031, 72043, 72047, 72053, 72073, 72077, 72089, 72091, 72101, 72103, 72109, 72139, 72161, 72167, 72169, 72173, 72211, 72221, 72223, 72227, 72229, 72251, 72253, 72269, 72271, 72277, 72287, 72307, 72313, 72337, 72341, 72353, 72367, 72379, 72383, 72421, 72431, 72461, 72467, 72469, 72481, 72493, 72497, 72503, 72533, 72547, 72551, 72559, 72577, 72613, 72617, 72623, 72643, 72647, 72649, 72661, 72671, 72673, 72679, 72689, 72701, 72707, 72719, 72727, 72733, 72739, 72763, 72767, 72797, 72817, 72823, 72859, 72869, 72871, 72883, 72889, 72893, 72901, 72907, 72911, 72923, 72931, 72937, 72949, 72953, 72959, 72973, 72977, 72997, 73009, 73013, 73019, 73037, 73039, 73043, 73061, 73063, 73079, 73091, 73121, 73127, 73133, 73141, 73181, 73189, 73237, 73243, 73259, 73277, 73291, 73303, 73309, 73327, 73331, 73351, 73361, 73363, 73369, 73379, 73387, 73417, 73421, 73433, 73453, 73459, 73471, 73477, 73483, 73517, 73523, 73529, 73547, 73553, 73561, 73571, 73583, 73589, 73597, 73607, 73609, 73613, 73637, 73643, 73651, 73673, 73679, 73681, 73693, 73699, 73709, 73721, 73727, 73751, 73757, 73771, 73783, 73819, 73823, 73847, 73849, 73859, 73867, 73877, 73883, 73897, 73907, 73939, 73943, 73951, 73961, 73973, 73999, 74017, 74021, 74027, 74047, 74051, 74071, 74077, 74093, 74099, 74101, 74131, 74143, 74149, 74159, 74161, 74167, 74177, 74189, 74197, 74201, 74203, 74209, 74219, 74231, 74257, 74279, 74287, 74293, 74297, 74311, 74317, 74323, 74353, 74357, 74363, 74377, 74381, 74383, 74411, 74413, 74419, 74441, 74449, 74453, 74471, 74489, 74507, 74509, 74521, 74527, 74531, 74551, 74561, 74567, 74573, 74587, 74597, 74609, 74611, 74623, 74653, 74687, 74699, 74707, 74713, 74717, 74719, 74729, 74731, 74747, 74759, 74761, 74771, 74779, 74797, 74821, 74827, 74831, 74843, 74857, 74861, 74869, 74873, 74887, 74891, 74897, 74903, 74923, 74929, 74933, 74941, 74959, 75011, 75013, 75017, 75029, 75037, 75041, 75079, 75083, 75109, 75133, 75149, 75161, 75167, 75169, 75181, 75193, 75209, 75211, 75217, 75223, 75227, 75239, 75253, 75269, 75277, 75289, 75307, 75323, 75329, 75337, 75347, 75353, 75367, 75377, 75389, 75391, 75401, 75403, 75407, 75431, 75437, 75479, 75503, 75511, 75521, 75527, 75533, 75539, 75541, 75553, 75557, 75571, 75577, 75583, 75611, 75617, 75619, 75629, 75641, 75653, 75659, 75679, 75683, 75689, 75703, 75707, 75709, 75721, 75731, 75743, 75767, 75773, 75781, 75787, 75793, 75797, 75821, 75833, 75853, 75869, 75883, 75913, 75931, 75937, 75941, 75967, 75979, 75983, 75989, 75991, 75997, 76001, 76003, 76031, 76039, 76079, 76081, 76091, 76099, 76103, 76123, 76129, 76147, 76157, 76159, 76163, 76207, 76213, 76231, 76243, 76249, 76253, 76259, 76261, 76283, 76289, 76303, 76333, 76343, 76367, 76369, 76379, 76387, 76403, 76421, 76423, 76441, 76463, 76471, 76481, 76487, 76493, 76507, 76511, 76519, 76537, 76541, 76543, 76561, 76579, 76597, 76603, 76607, 76631, 76649, 76651, 76667, 76673, 76679, 76697, 76717, 76733, 76753, 76757, 76771, 76777, 76781, 76801, 76819, 76829, 76831, 76837, 76847, 76871, 76873, 76883, 76907, 76913, 76919, 76943, 76949, 76961, 76963, 76991, 77003, 77017, 77023, 77029, 77041, 77047, 77069, 77081, 77093, 77101, 77137, 77141, 77153, 77167, 77171, 77191, 77201, 77213, 77237, 77239, 77243, 77249, 77261, 77263, 77267, 77269, 77279, 77291, 77317, 77323, 77339, 77347, 77351, 77359, 77369, 77377, 77383, 77417, 77419, 77431, 77447, 77471, 77477, 77479, 77489, 77491, 77509, 77513, 77521, 77527, 77543, 77549, 77551, 77557, 77563, 77569, 77573, 77587, 77591, 77611, 77617, 77621, 77641, 77647, 77659, 77681, 77687, 77689, 77699, 77711, 77713, 77719, 77723, 77731, 77743, 77747, 77761, 77773, 77783, 77797, 77801, 77813, 77839, 77849, 77863, 77867, 77893, 77899, 77929, 77933, 77951, 77969, 77977, 77983, 77999, 78007, 78017, 78031, 78041, 78049, 78059, 78079, 78101, 78121, 78137, 78139, 78157, 78163, 78167, 78173, 78179, 78191, 78193, 78203, 78229, 78233, 78241, 78259, 78277, 78283, 78301, 78307, 78311, 78317, 78341, 78347, 78367, 78401, 78427, 78437, 78439, 78467, 78479, 78487, 78497, 78509, 78511, 78517, 78539, 78541, 78553, 78569, 78571, 78577, 78583, 78593, 78607, 78623, 78643, 78649, 78653, 78691, 78697, 78707, 78713, 78721, 78737, 78779, 78781, 78787, 78791, 78797, 78803, 78809, 78823, 78839, 78853, 78857, 78877, 78887, 78889, 78893, 78901, 78919, 78929, 78941, 78977, 78979, 78989, 79031, 79039, 79043, 79063, 79087, 79103, 79111, 79133, 79139, 79147, 79151, 79153, 79159, 79181, 79187, 79193, 79201, 79229, 79231, 79241, 79259, 79273, 79279, 79283, 79301, 79309, 79319, 79333, 79337, 79349, 79357, 79367, 79379, 79393, 79397, 79399, 79411, 79423, 79427, 79433, 79451, 79481, 79493, 79531, 79537, 79549, 79559, 79561, 79579, 79589, 79601, 79609, 79613, 79621, 79627, 79631, 79633, 79657, 79669, 79687, 79691, 79693, 79697, 79699, 79757, 79769, 79777, 79801, 79811, 79813, 79817, 79823, 79829, 79841, 79843, 79847, 79861, 79867, 79873, 79889, 79901, 79903, 79907, 79939, 79943, 79967, 79973, 79979, 79987, 79997, 79999, 80021, 80039, 80051, 80071, 80077, 80107, 80111, 80141, 80147, 80149, 80153, 80167, 80173, 80177, 80191, 80207, 80209, 80221, 80231, 80233, 80239, 80251, 80263, 80273, 80279, 80287, 80309, 80317, 80329, 80341, 80347, 80363, 80369, 80387, 80407, 80429, 80447, 80449, 80471, 80473, 80489, 80491, 80513, 80527, 80537, 80557, 80567, 80599, 80603, 80611, 80621, 80627, 80629, 80651, 80657, 80669, 80671, 80677, 80681, 80683, 80687, 80701, 80713, 80737, 80747, 80749, 80761, 80777, 80779, 80783, 80789, 80803, 80809, 80819, 80831, 80833, 80849, 80863, 80897, 80909, 80911, 80917, 80923, 80929, 80933, 80953, 80963, 80989, 81001, 81013, 81017, 81019, 81023, 81031, 81041, 81043, 81047, 81049, 81071, 81077, 81083, 81097, 81101, 81119, 81131, 81157, 81163, 81173, 81181, 81197, 81199, 81203, 81223, 81233, 81239, 81281, 81283, 81293, 81299, 81307, 81331, 81343, 81349, 81353, 81359, 81371, 81373, 81401, 81409, 81421, 81439, 81457, 81463, 81509, 81517, 81527, 81533, 81547, 81551, 81553, 81559, 81563, 81569, 81611, 81619, 81629, 81637, 81647, 81649, 81667, 81671, 81677, 81689, 81701, 81703, 81707, 81727, 81737, 81749, 81761, 81769, 81773, 81799, 81817, 81839, 81847, 81853, 81869, 81883, 81899, 81901, 81919, 81929, 81931, 81937, 81943, 81953, 81967, 81971, 81973, 82003, 82007, 82009, 82013, 82021, 82031, 82037, 82039, 82051, 82067, 82073, 82129, 82139, 82141, 82153, 82163, 82171, 82183, 82189, 82193, 82207, 82217, 82219, 82223, 82231, 82237, 82241, 82261, 82267, 82279, 82301, 82307, 82339, 82349, 82351, 82361, 82373, 82387, 82393, 82421, 82457, 82463, 82469, 82471, 82483, 82487, 82493, 82499, 82507, 82529, 82531, 82549, 82559, 82561, 82567, 82571, 82591, 82601, 82609, 82613, 82619, 82633, 82651, 82657, 82699, 82721, 82723, 82727, 82729, 82757, 82759, 82763, 82781, 82787, 82793, 82799, 82811, 82813, 82837, 82847, 82883, 82889, 82891, 82903, 82913, 82939, 82963, 82981, 82997, 83003, 83009, 83023, 83047, 83059, 83063, 83071, 83077, 83089, 83093, 83101, 83117, 83137, 83177, 83203, 83207, 83219, 83221, 83227, 83231, 83233, 83243, 83257, 83267, 83269, 83273, 83299, 83311, 83339, 83341, 83357, 83383, 83389, 83399, 83401, 83407, 83417, 83423, 83431, 83437, 83443, 83449, 83459, 83471, 83477, 83497, 83537, 83557, 83561, 83563, 83579, 83591, 83597, 83609, 83617, 83621, 83639, 83641, 83653, 83663, 83689, 83701, 83717, 83719, 83737, 83761, 83773, 83777, 83791, 83813, 83833, 83843, 83857, 83869, 83873, 83891, 83903, 83911, 83921, 83933, 83939, 83969, 83983, 83987, 84011, 84017, 84047, 84053, 84059, 84061, 84067, 84089, 84121, 84127, 84131, 84137, 84143, 84163, 84179, 84181, 84191, 84199, 84211, 84221, 84223, 84229, 84239, 84247, 84263, 84299, 84307, 84313, 84317, 84319, 84347, 84349, 84377, 84389, 84391, 84401, 84407, 84421, 84431, 84437, 84443, 84449, 84457, 84463, 84467, 84481, 84499, 84503, 84509, 84521, 84523, 84533, 84551, 84559, 84589, 84629, 84631, 84649, 84653, 84659, 84673, 84691, 84697, 84701, 84713, 84719, 84731, 84737, 84751, 84761, 84787, 84793, 84809, 84811, 84827, 84857, 84859, 84869, 84871, 84913, 84919, 84947, 84961, 84967, 84977, 84979, 84991, 85009, 85021, 85027, 85037, 85049, 85061, 85081, 85087, 85091, 85093, 85103, 85109, 85121, 85133, 85147, 85159, 85193, 85199, 85201, 85213, 85223, 85229, 85237, 85243, 85247, 85259, 85297, 85303, 85313, 85331, 85333, 85361, 85363, 85369, 85381, 85411, 85427, 85429, 85439, 85447, 85451, 85453, 85469, 85487, 85513, 85517, 85523, 85531, 85549, 85571, 85577, 85597, 85601, 85607, 85619, 85621, 85627, 85639, 85643, 85661, 85667, 85669, 85691, 85703, 85711, 85717, 85733, 85751, 85781, 85793, 85817, 85819, 85829, 85831, 85837, 85843, 85847, 85853, 85889, 85903, 85909, 85931, 85933, 85991, 85999, 86011, 86017, 86027, 86029, 86069, 86077, 86083, 86111, 86113, 86117, 86131, 86137, 86143, 86161, 86171, 86179, 86183, 86197, 86201, 86209, 86239, 86243, 86249, 86257, 86263, 86269, 86287, 86291, 86293, 86297, 86311, 86323, 86341, 86351, 86353, 86357, 86369, 86371, 86381, 86389, 86399, 86413, 86423, 86441, 86453, 86461, 86467, 86477, 86491, 86501, 86509, 86531, 86533, 86539, 86561, 86573, 86579, 86587, 86599, 86627, 86629, 86677, 86689, 86693, 86711, 86719, 86729, 86743, 86753, 86767, 86771, 86783, 86813, 86837, 86843, 86851, 86857, 86861, 86869, 86923, 86927, 86929, 86939, 86951, 86959, 86969, 86981, 86993, 87011, 87013, 87037, 87041, 87049, 87071, 87083, 87103, 87107, 87119, 87121, 87133, 87149, 87151, 87179, 87181, 87187, 87211, 87221, 87223, 87251, 87253, 87257, 87277, 87281, 87293, 87299, 87313, 87317, 87323, 87337, 87359, 87383, 87403, 87407, 87421, 87427, 87433, 87443, 87473, 87481, 87491, 87509, 87511, 87517, 87523, 87539, 87541, 87547, 87553, 87557, 87559, 87583, 87587, 87589, 87613, 87623, 87629, 87631, 87641, 87643, 87649, 87671, 87679, 87683, 87691, 87697, 87701, 87719, 87721, 87739, 87743, 87751, 87767, 87793, 87797, 87803, 87811, 87833, 87853, 87869, 87877, 87881, 87887, 87911, 87917, 87931, 87943, 87959, 87961, 87973, 87977, 87991, 88001, 88003, 88007, 88019, 88037, 88069, 88079, 88093, 88117, 88129, 88169, 88177, 88211, 88223, 88237, 88241, 88259, 88261, 88289, 88301, 88321, 88327, 88337, 88339, 88379, 88397, 88411, 88423, 88427, 88463, 88469, 88471, 88493, 88499, 88513, 88523, 88547, 88589, 88591, 88607, 88609, 88643, 88651, 88657, 88661, 88663, 88667, 88681, 88721, 88729, 88741, 88747, 88771, 88789, 88793, 88799, 88801, 88807, 88811, 88813, 88817, 88819, 88843, 88853, 88861, 88867, 88873, 88883, 88897, 88903, 88919, 88937, 88951, 88969, 88993, 88997, 89003, 89009, 89017, 89021, 89041, 89051, 89057, 89069, 89071, 89083, 89087, 89101, 89107, 89113, 89119, 89123, 89137, 89153, 89189, 89203, 89209, 89213, 89227, 89231, 89237, 89261, 89269, 89273, 89293, 89303, 89317, 89329, 89363, 89371, 89381, 89387, 89393, 89399, 89413, 89417, 89431, 89443, 89449, 89459, 89477, 89491, 89501, 89513, 89519, 89521, 89527, 89533, 89561, 89563, 89567, 89591, 89597, 89599, 89603, 89611, 89627, 89633, 89653, 89657, 89659, 89669, 89671, 89681, 89689, 89753, 89759, 89767, 89779, 89783, 89797, 89809, 89819, 89821, 89833, 89839, 89849, 89867, 89891, 89897, 89899, 89909, 89917, 89923, 89939, 89959, 89963, 89977, 89983, 89989, 90001, 90007, 90011, 90017, 90019, 90023, 90031, 90053, 90059, 90067, 90071, 90073, 90089, 90107, 90121, 90127, 90149, 90163, 90173, 90187, 90191, 90197, 90199, 90203, 90217, 90227, 90239, 90247, 90263, 90271, 90281, 90289, 90313, 90353, 90359, 90371, 90373, 90379, 90397, 90401, 90403, 90407, 90437, 90439, 90469, 90473, 90481, 90499, 90511, 90523, 90527, 90529, 90533, 90547, 90583, 90599, 90617, 90619, 90631, 90641, 90647, 90659, 90677, 90679, 90697, 90703, 90709, 90731, 90749, 90787, 90793, 90803, 90821, 90823, 90833, 90841, 90847, 90863, 90887, 90901, 90907, 90911, 90917, 90931, 90947, 90971, 90977, 90989, 90997, 91009, 91019, 91033, 91079, 91081, 91097, 91099, 91121, 91127, 91129, 91139, 91141, 91151, 91153, 91159, 91163, 91183, 91193, 91199, 91229, 91237, 91243, 91249, 91253, 91283, 91291, 91297, 91303, 91309, 91331, 91367, 91369, 91373, 91381, 91387, 91393, 91397, 91411, 91423, 91433, 91453, 91457, 91459, 91463, 91493, 91499, 91513, 91529, 91541, 91571, 91573, 91577, 91583, 91591, 91621, 91631, 91639, 91673, 91691, 91703, 91711, 91733, 91753, 91757, 91771, 91781, 91801, 91807, 91811, 91813, 91823, 91837, 91841, 91867, 91873, 91909, 91921, 91939, 91943, 91951, 91957, 91961, 91967, 91969, 91997, 92003, 92009, 92033, 92041, 92051, 92077, 92083, 92107, 92111, 92119, 92143, 92153, 92173, 92177, 92179, 92189, 92203, 92219, 92221, 92227, 92233, 92237, 92243, 92251, 92269, 92297, 92311, 92317, 92333, 92347, 92353, 92357, 92363, 92369, 92377, 92381, 92383, 92387, 92399, 92401, 92413, 92419, 92431, 92459, 92461, 92467, 92479, 92489, 92503, 92507, 92551, 92557, 92567, 92569, 92581, 92593, 92623, 92627, 92639, 92641, 92647, 92657, 92669, 92671, 92681, 92683, 92693, 92699, 92707, 92717, 92723, 92737, 92753, 92761, 92767, 92779, 92789, 92791, 92801, 92809, 92821, 92831, 92849, 92857, 92861, 92863, 92867, 92893, 92899, 92921, 92927, 92941, 92951, 92957, 92959, 92987, 92993, 93001, 93047, 93053, 93059, 93077, 93083, 93089, 93097, 93103, 93113, 93131, 93133, 93139, 93151, 93169, 93179, 93187, 93199, 93229, 93239, 93241, 93251, 93253, 93257, 93263, 93281, 93283, 93287, 93307, 93319, 93323, 93329, 93337, 93371, 93377, 93383, 93407, 93419, 93427, 93463, 93479, 93481, 93487, 93491, 93493, 93497, 93503, 93523, 93529, 93553, 93557, 93559, 93563, 93581, 93601, 93607, 93629, 93637, 93683, 93701, 93703, 93719, 93739, 93761, 93763, 93787, 93809, 93811, 93827, 93851, 93871, 93887, 93889, 93893, 93901, 93911, 93913, 93923, 93937, 93941, 93949, 93967, 93971, 93979, 93983, 93997, 94007, 94009, 94033, 94049, 94057, 94063, 94079, 94099, 94109, 94111, 94117, 94121, 94151, 94153, 94169, 94201, 94207, 94219, 94229, 94253, 94261, 94273, 94291, 94307, 94309, 94321, 94327, 94331, 94343, 94349, 94351, 94379, 94397, 94399, 94421, 94427, 94433, 94439, 94441, 94447, 94463, 94477, 94483, 94513, 94529, 94531, 94541, 94543, 94547, 94559, 94561, 94573, 94583, 94597, 94603, 94613, 94621, 94649, 94651, 94687, 94693, 94709, 94723, 94727, 94747, 94771, 94777, 94781, 94789, 94793, 94811, 94819, 94823, 94837, 94841, 94847, 94849, 94873, 94889, 94903, 94907, 94933, 94949, 94951, 94961, 94993, 94999, 95003, 95009, 95021, 95027, 95063, 95071, 95083, 95087, 95089, 95093, 95101, 95107, 95111, 95131, 95143, 95153, 95177, 95189, 95191, 95203, 95213, 95219, 95231, 95233, 95239, 95257, 95261, 95267, 95273, 95279, 95287, 95311, 95317, 95327, 95339, 95369, 95383, 95393, 95401, 95413, 95419, 95429, 95441, 95443, 95461, 95467, 95471, 95479, 95483, 95507, 95527, 95531, 95539, 95549, 95561, 95569, 95581, 95597, 95603, 95617, 95621, 95629, 95633, 95651, 95701, 95707, 95713, 95717, 95723, 95731, 95737, 95747, 95773, 95783, 95789, 95791, 95801, 95803, 95813, 95819, 95857, 95869, 95873, 95881, 95891, 95911, 95917, 95923, 95929, 95947, 95957, 95959, 95971, 95987, 95989, 96001, 96013, 96017, 96043, 96053, 96059, 96079, 96097, 96137, 96149, 96157, 96167, 96179, 96181, 96199, 96211, 96221, 96223, 96233, 96259, 96263, 96269, 96281, 96289, 96293, 96323, 96329, 96331, 96337, 96353, 96377, 96401, 96419, 96431, 96443, 96451, 96457, 96461, 96469, 96479, 96487, 96493, 96497, 96517, 96527, 96553, 96557, 96581, 96587, 96589, 96601, 96643, 96661, 96667, 96671, 96697, 96703, 96731, 96737, 96739, 96749, 96757, 96763, 96769, 96779, 96787, 96797, 96799, 96821, 96823, 96827, 96847, 96851, 96857, 96893, 96907, 96911, 96931, 96953, 96959, 96973, 96979, 96989, 96997, 97001, 97003, 97007, 97021, 97039, 97073, 97081, 97103, 97117, 97127, 97151, 97157, 97159, 97169, 97171, 97177, 97187, 97213, 97231, 97241, 97259, 97283, 97301, 97303, 97327, 97367, 97369, 97373, 97379, 97381, 97387, 97397, 97423, 97429, 97441, 97453, 97459, 97463, 97499, 97501, 97511, 97523, 97547, 97549, 97553, 97561, 97571, 97577, 97579, 97583, 97607, 97609, 97613, 97649, 97651, 97673, 97687, 97711, 97729, 97771, 97777, 97787, 97789, 97813, 97829, 97841, 97843, 97847, 97849, 97859, 97861, 97871, 97879, 97883, 97919, 97927, 97931, 97943, 97961, 97967, 97973, 97987, 98009, 98011, 98017, 98041, 98047, 98057, 98081, 98101, 98123, 98129, 98143, 98179, 98207, 98213, 98221, 98227, 98251, 98257, 98269, 98297, 98299, 98317, 98321, 98323, 98327, 98347, 98369, 98377, 98387, 98389, 98407, 98411, 98419, 98429, 98443, 98453, 98459, 98467, 98473, 98479, 98491, 98507, 98519, 98533, 98543, 98561, 98563, 98573, 98597, 98621, 98627, 98639, 98641, 98663, 98669, 98689, 98711, 98713, 98717, 98729, 98731, 98737, 98773, 98779, 98801, 98807, 98809, 98837, 98849, 98867, 98869, 98873, 98887, 98893, 98897, 98899, 98909, 98911, 98927, 98929, 98939, 98947, 98953, 98963, 98981, 98993, 98999, 99013, 99017, 99023, 99041, 99053, 99079, 99083, 99089, 99103, 99109, 99119, 99131, 99133, 99137, 99139, 99149, 99173, 99181, 99191, 99223, 99233, 99241, 99251, 99257, 99259, 99277, 99289, 99317, 99347, 99349, 99367, 99371, 99377, 99391, 99397, 99401, 99409, 99431, 99439, 99469, 99487, 99497, 99523, 99527, 99529, 99551, 99559, 99563, 99571, 99577, 99581, 99607, 99611, 99623, 99643, 99661, 99667, 99679, 99689, 99707, 99709, 99713, 99719, 99721, 99733, 99761, 99767, 99787, 99793, 99809, 99817, 99823, 99829, 99833, 99839, 99859, 99871, 99877, 99881, 99901, 99907, 99923, 99929, 99961, 99971, 99989, 99991, 100003, 100019, 100043, 100049, 100057, 100069, 100103, 100109, 100129, 100151, 100153, 100169, 100183, 100189, 100193, 100207, 100213, 100237, 100267, 100271, 100279, 100291, 100297, 100313, 100333, 100343, 100357, 100361, 100363, 100379, 100391, 100393, 100403, 100411, 100417, 100447, 100459, 100469, 100483, 100493, 100501, 100511, 100517, 100519, 100523, 100537, 100547, 100549, 100559, 100591, 100609, 100613, 100621, 100649, 100669, 100673, 100693, 100699, 100703, 100733, 100741, 100747, 100769, 100787, 100799, 100801, 100811, 100823, 100829, 100847, 100853, 100907, 100913, 100927, 100931, 100937, 100943, 100957, 100981, 100987, 100999, 101009, 101021, 101027, 101051, 101063, 101081, 101089, 101107, 101111, 101113, 101117, 101119, 101141, 101149, 101159, 101161, 101173, 101183, 101197, 101203, 101207, 101209, 101221, 101267, 101273, 101279, 101281, 101287, 101293, 101323, 101333, 101341, 101347, 101359, 101363, 101377, 101383, 101399, 101411, 101419, 101429, 101449, 101467, 101477, 101483, 101489, 101501, 101503, 101513, 101527, 101531, 101533, 101537, 101561, 101573, 101581, 101599, 101603, 101611, 101627, 101641, 101653, 101663, 101681, 101693, 101701, 101719, 101723, 101737, 101741, 101747, 101749, 101771, 101789, 101797, 101807, 101833, 101837, 101839, 101863, 101869, 101873, 101879, 101891, 101917, 101921, 101929, 101939, 101957, 101963, 101977, 101987, 101999, 102001, 102013, 102019, 102023, 102031, 102043, 102059, 102061, 102071, 102077, 102079, 102101, 102103, 102107, 102121, 102139, 102149, 102161, 102181, 102191, 102197, 102199, 102203, 102217, 102229, 102233, 102241, 102251, 102253, 102259, 102293, 102299, 102301, 102317, 102329, 102337, 102359, 102367, 102397, 102407, 102409, 102433, 102437, 102451, 102461, 102481, 102497, 102499, 102503, 102523, 102533, 102539, 102547, 102551, 102559, 102563, 102587, 102593, 102607, 102611, 102643, 102647, 102653, 102667, 102673, 102677, 102679, 102701, 102761, 102763, 102769, 102793, 102797, 102811, 102829, 102841, 102859, 102871, 102877, 102881, 102911, 102913, 102929, 102931, 102953, 102967, 102983, 103001, 103007, 103043, 103049, 103067, 103069, 103079, 103087, 103091, 103093, 103099, 103123, 103141, 103171, 103177, 103183, 103217, 103231, 103237, 103289, 103291, 103307, 103319, 103333, 103349, 103357, 103387, 103391, 103393, 103399, 103409, 103421, 103423, 103451, 103457, 103471, 103483, 103511, 103529, 103549, 103553, 103561, 103567, 103573, 103577, 103583, 103591, 103613, 103619, 103643, 103651, 103657, 103669, 103681, 103687, 103699, 103703, 103723, 103769, 103787, 103801, 103811, 103813, 103837, 103841, 103843, 103867, 103889, 103903, 103913, 103919, 103951, 103963, 103967, 103969, 103979, 103981, 103991, 103993, 103997, 104003, 104009, 104021, 104033, 104047, 104053, 104059, 104087, 104089, 104107, 104113, 104119, 104123, 104147, 104149, 104161, 104173, 104179, 104183, 104207, 104231, 104233, 104239, 104243, 104281, 104287, 104297, 104309, 104311, 104323, 104327, 104347, 104369, 104381, 104383, 104393, 104399, 104417, 104459, 104471, 104473, 104479, 104491, 104513, 104527, 104537, 104543, 104549, 104551, 104561, 104579, 104593, 104597, 104623, 104639, 104651, 104659, 104677, 104681, 104683, 104693, 104701, 104707, 104711, 104717, 104723, 104729, }; #endif stk/src/stk_dist_matrixx.c0000644000000000000000000000770713156161544013121 0ustar /***************************************************************************** * * * Small (Matlab/Octave) Toolbox for Kriging * * * * Copyright Notice * * * * Copyright (C) 2015 CentraleSupelec * * Copyright (C) 2011, 2012 SUPELEC * * * * Authors: Julien Bect * * Emmanuel Vazquez * * * * Copying Permission Statement * * * * This file is part of * * * * STK: a Small (Matlab/Octave) Toolbox for Kriging * * (http://sourceforge.net/projects/kriging) * * * * STK 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. * * * * STK 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 STK. If not, see . * * * ****************************************************************************/ #include "stk_mex.h" static void distance1(double* x, double* h, size_t nx, size_t dim) { size_t i, j, k1, k2; double diff, lambda; for (i = 0; i < nx; i++) { /* put a zero on the diagonal */ h[i*(nx+1)] = 0.0; for (j = i+1; j < nx; j++) { /* compute distance between x[i,:] and x[j,:] */ lambda = 0.0; for (k1 = i, k2 = j; k1 < dim * nx; k1 += nx, k2 += nx) { diff = x[k1] - x[k2]; lambda += diff * diff; } /* store the result in h, twice for symmetry */ h[i+nx*j] = sqrt(lambda); h[j+nx*i] = h[i+nx*j]; } } } mxArray* compute_distance_xx(const mxArray* x) { size_t d, n; mxArray* h; if(!stk_is_realmatrix(x)) mexErrMsgTxt("The input should be a real-valued double-precision array."); /* Read the size of the input argument */ n = mxGetM(x); d = mxGetN(x); /* Create a matrix for the return argument */ h = mxCreateDoubleMatrix(n, n, mxREAL); /* Do the actual computations in a subroutine */ distance1(mxGetPr(x), mxGetPr(h), n, d); return h; } void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray*prhs[]) { if (nlhs > 1) /* Check number of output arguments */ mexErrMsgTxt("Too many output arguments."); if (nrhs != 1) /* Check number of input arguments */ mexErrMsgTxt("Incorrect number of input arguments."); plhs[0] = compute_distance_xx(prhs[0]); } stk/src/stk_dist_matrixy.c0000644000000000000000000001020713156161544013107 0ustar /***************************************************************************** * * * Small (Matlab/Octave) Toolbox for Kriging * * * * Copyright Notice * * * * Copyright (C) 2015 CentraleSupelec * * Copyright (C) 2011, 2012 SUPELEC * * * * Authors: Julien Bect * * Emmanuel Vazquez * * * * Copying Permission Statement * * * * This file is part of * * * * STK: a Small (Matlab/Octave) Toolbox for Kriging * * (http://sourceforge.net/projects/kriging) * * * * STK 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. * * * * STK 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 STK. If not, see . * * * ****************************************************************************/ #include "stk_mex.h" static void distance2(double* x, double* y, double* h, size_t nx, size_t ny, size_t dim) { size_t i, j, kx, ky; double diff, lambda; for (i = 0; i < nx; i++) { for (j = 0; j < ny; j++) { /* compute distance between x[i,:] and y[j,:] */ lambda = 0.0; for (kx = i, ky = j; kx < dim * nx; kx += nx, ky += ny) { diff = x[kx] - y[ky]; lambda += diff * diff; } /* store the result in h */ h[i+nx*j] = sqrt(lambda); } } } mxArray* compute_distance_xy(const mxArray* x, const mxArray* y) { size_t d, mx, my; mxArray* h; if((!stk_is_realmatrix(x)) || (!stk_is_realmatrix(y))) mexErrMsgTxt("Input arguments should be real-valued double-precision array."); /* Check that the input arguments have the same number of columns */ if (mxGetN(y) != (d = mxGetN(x))) mexErrMsgTxt("Both input arguments should have the same number of columns."); /* Read the size (number of lines) of each input argument */ mx = mxGetM(x); my = mxGetM(y); /* Create a matrix for the return argument */ h = mxCreateDoubleMatrix(mx, my, mxREAL); /* Do the actual computations in a subroutine */ distance2(mxGetPr(x), mxGetPr(y), mxGetPr(h), mx, my, d); return h; } void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray*prhs[]) { if (nlhs > 1) /* Check number of output arguments */ mexErrMsgTxt("Too many output arguments."); if (nrhs != 2) /* Check number of input arguments */ mexErrMsgTxt("Incorrect number of input arguments."); plhs[0] = compute_distance_xy(prhs[0], prhs[1]); } stk/src/stk_dist_pairwise.c0000644000000000000000000001010113156161544013226 0ustar /***************************************************************************** * * * Small (Matlab/Octave) Toolbox for Kriging * * * * Copyright Notice * * * * Copyright (C) 2015 CentraleSupelec * * Copyright (C) 2012 SUPELEC * * * * Author: Julien Bect * * * * Copying Permission Statement * * * * This file is part of * * * * STK: a Small (Matlab/Octave) Toolbox for Kriging * * (http://sourceforge.net/projects/kriging) * * * * STK 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. * * * * STK 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 STK. If not, see . * * * ****************************************************************************/ #include "stk_mex.h" static void distance3(double* x, double* y, double* h, size_t n, size_t dim) { size_t i, k; double diff, lambda; for (i = 0; i < n; i++) { /* compute distance between x[i,:] and y[j,:] */ lambda = 0.0; for (k = i; k < dim * n; k += n) { diff = x[k] - y[k]; lambda += diff * diff; } /* store the result in h */ h[i] = sqrt(lambda); } } mxArray* compute_distance_xy_pairwise(const mxArray* x, const mxArray* y) { size_t d, n; mxArray* h; if((!stk_is_realmatrix(x)) || (!stk_is_realmatrix(y))) mexErrMsgTxt("Input arguments should be real-valued double-precision array."); /* Check that the input arguments have the same number of columns */ if (mxGetN(y) != (d = mxGetN(x))) mexErrMsgTxt("Both input arguments should have the same number of columns."); /* Check that the input arguments have the same number of rows */ if (mxGetM(y) != (n = mxGetM(x))) mexErrMsgTxt("Both input arguments should have the same number of rows."); /* Create a matrix for the return argument */ h = mxCreateDoubleMatrix(n, 1, mxREAL); /* Do the actual computations in a subroutine */ distance3(mxGetPr(x), mxGetPr(y), mxGetPr(h), n, d); return h; } void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray*prhs[]) { if (nlhs > 1) /* Check number of output arguments */ mexErrMsgTxt("Too many output arguments."); if (nrhs != 2) /* Check number of input arguments */ mexErrMsgTxt("Incorrect number of input arguments."); plhs[0] = compute_distance_xy_pairwise(prhs[0], prhs[1]); } stk/src/stk_distrib_bivnorm0_cdf.c0000644000000000000000000004165213156161544014467 0ustar /***************************************************************************** * * * Small (Matlab/Octave) Toolbox for Kriging * * * * Copyright Notice * * * * Copyright (C) 2017 CentraleSupelec * * Copyright (C) 2014 Supelec * * * * Author: Julien Bect * * * * Based on mvndstpack.f by Yihong Ge and Alan Genz * * (see original copyright notice below) * * * * Copying Permission Statement * * * * This file is part of * * * * STK: a Small (Matlab/Octave) Toolbox for Kriging * * (http://sourceforge.net/projects/kriging) * * * * STK 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. * * * * STK 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 STK. If not, see . * * * ****************************************************************************/ #include "stk_mex.h" double bvu (double h, double k, double rho); double mvnphi (double z); #define MAX(a,b) ((a) >= (b) ? (a) : (b)) #define BIGNUM 40.0 /* this is BIG for a normal deviate */ #define ARGIN_UPPER prhs[0] /* n x 2 */ #define ARGIN_RHO prhs[1] /* n x 1 */ #define ARGOUT_PROBA plhs[0] /* n x 1 */ #define ARGOUT_QROBA plhs[1] /* n x 1 */ void mexFunction ( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[] ) { size_t n; int i; double *u1, *u2, *rho, *proba, *qroba; double q01, q10, q11; mxArray *mxProba, *mxQroba; /*--- check number of input / output arguments -------------------------*/ if (nrhs != 2) { mexErrMsgTxt ("Incorrect number of input arguments."); } if (nlhs > 2) { mexErrMsgTxt ("Too many output arguments."); } /*--- check input arguments types -------------------------------------*/ if ((! stk_is_realmatrix (ARGIN_UPPER)) || (mxGetN (ARGIN_UPPER) != 2)) { mexErrMsgTxt ("Input argument #1 (upper) should be a real " "double-precision matrix with two columns."); } if ((! stk_is_realmatrix (ARGIN_RHO)) || (mxGetN (ARGIN_RHO) != 1)) { mexErrMsgTxt ("Input argument #2 (rho) should be a real " "double-precision column vector."); } n = mxGetM (ARGIN_UPPER); if (mxGetM (ARGIN_RHO) != n) { mexErrMsgTxt ("Input arguments #1 (upper) and #2 (rho) should " "have the same number of rows"); } /*--- prepare the output argument --------------------------------------*/ mxProba = mxCreateDoubleMatrix (n, 1, mxREAL); mxQroba = mxCreateDoubleMatrix (n, 1, mxREAL); /*--- get pointers to the actual data ----------------------------------*/ u1 = mxGetPr (ARGIN_UPPER); u2 = u1 + n; rho = mxGetPr (ARGIN_RHO); proba = mxGetPr (mxProba); qroba = mxGetPr (mxQroba); /*--- compute probabilities --------------------------------------------*/ for (i = 0; i < n; i++) { if ((u1[i] < - BIGNUM) || (u2[i] < - BIGNUM)) { proba[i] = 0.0; qroba[i] = 1.0; } else if (u1[i] > BIGNUM) { if (u2[i] < 0) { proba[i] = mvnphi (u2[i]); qroba[i] = 1 - proba[i]; } else { qroba[i] = mvnphi (- u2[i]); proba[i] = 1 - qroba[i]; } } else if (u2[i] > BIGNUM) { if (u1[i] < 0) { proba[i] = mvnphi (u1[i]); qroba[i] = 1 - proba[i]; } else { qroba[i] = mvnphi (- u1[i]); proba[i] = 1 - qroba[i]; } } else if ((u1[i] < 0) || (u2[i] < 0)) { proba[i] = bvu (- u1[i], - u2[i], rho[i]); qroba[i] = 1 - proba[i]; } else { q11 = bvu (u1[i], u2[i], rho[i]); q10 = (mvnphi (- u1[i])) - q11; q10 = MAX(q10, 0); q01 = (mvnphi (- u2[i])) - q11; q01 = MAX(q01, 0); qroba[i] = q11 + q01 + q10; proba[i] = 1 - qroba[i]; } } /*--- the end ----------------------------------------------------------*/ ARGOUT_PROBA = mxProba; if (nlhs > 1) ARGOUT_QROBA = mxQroba; else mxDestroyArray (mxQroba); } /************************************************************************** * * * The following code has been obtained by translating the Fortran code * * mvndstpack.f to C using f2c (version 20100827) and then extracting and * * manually cleaning up the relevant functions. * * * * mvndstpack.f was obtained by HTTP on 2014/12/09 from: * * * * http://www.math.wsu.edu/faculty/genz/software/fort77/mvtdstpack.f * * * * It is distributed under the following ("modified BSD") licence: * * * * Copyright (C) 2013, Alan Genz, All rights reserved. * * * * Redistribution and use in source and binary forms, with or without * * modification, are permitted provided the following conditions are met: * * 1. Redistributions of source code must retain the above copyright * * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * * notice, this list of conditions and the following disclaimer in * * the documentation and/or other materials provided with the * * distribution. * * 3. The contributor name(s) may not be used to endorse or promote * * products derived from this software without specific prior * * written permission. * * * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF USE * * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * * **************************************************************************/ /************************************************************************** * * * A function for computing bivariate normal probabilities * * * * Yihong Ge * * Department of Computer Science and Electrical Engineering * * Washington State University * * Pullman, WA 99164-2752 * * * * and * * * * Alan Genz * * Department of Mathematics * * Washington State University * * Pullman, WA 99164-3113 * * Email : alangenz@wsu.edu * * * * double bvu (double h, double k, double *r__) * * * * Calculate the probability that X > h and Y > k for a standard * * bivariate Gaussian vector (X, Y) with correlation coefficient *r__ * * * **************************************************************************/ double bvu (double h, double k, double rho) { static struct { double e_1[3]; double fill_2[7]; double e_3[6]; double fill_4[4]; double e_5[10]; } equiv_122 = { {.1713244923791705, .3607615730481384, .4679139345726904}, {0}, {.04717533638651177, .1069393259953183, .1600783285433464, .2031674267230659, .2334925365383547, .2491470458134029}, {0}, {.01761400713915212, .04060142980038694, .06267204833410906, .08327674157670475, .1019301198172404, .1181945319615184, .1316886384491766, .1420961093183821, .1491729864726037, .1527533871307259} }; #define w ((double *)&equiv_122) static struct { double e_1[3]; double fill_2[7]; double e_3[6]; double fill_4[4]; double e_5[10]; } equiv_123 = { {-.9324695142031522, -.6612093864662647, -.238619186083197}, {0}, {-.9815606342467191, -.904117256370475, -.769902674194305, -.5873179542866171, -.3678314989981802, -.1252334085114692}, {0}, {-.9931285991850949, -.9639719272779138, -.9122344282513259, -.8391169718222188, -.7463319064601508, -.636053680726515, -.5108670019508271, -.3737060887154196, -.2277858511416451, -.07652652113349733} }; #define x ((double *)&equiv_123) /* System generated locals */ int i__1; double d__1, d__2; /* Local variables */ double a, b, c__, d__; int i__, lg, ng; double as; double bs, hk, hs, sn, rs, xs, bvn, asr; /* Gauss Legendre Points and Weights, N = 6 */ /* Gauss Legendre Points and Weights, N = 12 */ /* Gauss Legendre Points and Weights, N = 20 */ if (fabs(rho) < .3f) { ng = 1; lg = 3; } else if (fabs(rho) < .75f) { ng = 2; lg = 6; } else { ng = 3; lg = 10; } hk = h * k; bvn = 0.; if (fabs(rho) < .925f) { hs = (h * h + k * k) / 2; asr = asin(rho); i__1 = lg; for (i__ = 1; i__ <= i__1; ++i__) { sn = sin(asr * (x[i__ + ng * 10 - 11] + 1) / 2); bvn += w[i__ + ng * 10 - 11] * exp((sn * hk - hs) / (1 - sn * sn)); sn = sin(asr * (-x[i__ + ng * 10 - 11] + 1) / 2); bvn += w[i__ + ng * 10 - 11] * exp((sn * hk - hs) / (1 - sn * sn)); } d__1 = -h; d__2 = -k; bvn = bvn * asr / 12.566370614359172 + mvnphi(d__1) * mvnphi(d__2); } else { if (rho < 0.) { k = -k; hk = -hk; } if (fabs(rho) < 1.) { as = (1 - rho) * (rho + 1); a = sqrt(as); /* Computing 2nd power */ d__1 = h - k; bs = d__1 * d__1; c__ = (4 - hk) / 8; d__ = (12 - hk) / 16; bvn = a * exp(-(bs / as + hk) / 2) * (1 - c__ * (bs - as) * (1 - d__ * bs / 5) / 3 + c__ * d__ * as * as / 5); if (hk > -160.) { b = sqrt(bs); d__1 = -b / a; bvn -= exp(-hk / 2) * sqrt(6.283185307179586) * mvnphi(d__1) * b * (1 - c__ * bs * (1 - d__ * bs / 5) / 3); } a /= 2; i__1 = lg; for (i__ = 1; i__ <= i__1; ++i__) { /* Computing 2nd power */ d__1 = a * (x[i__ + ng * 10 - 11] + 1); xs = d__1 * d__1; rs = sqrt(1 - xs); bvn += a * w[i__ + ng * 10 - 11] * (exp(-bs / (xs * 2) - hk / (rs + 1)) / rs - exp(-(bs / xs + hk) / 2) * (c__ * xs * (d__ * xs + 1) + 1)); /* Computing 2nd power */ d__1 = -x[i__ + ng * 10 - 11] + 1; xs = as * (d__1 * d__1) / 4; rs = sqrt(1 - xs); /* Computing 2nd power */ d__1 = rs + 1; bvn += a * w[i__ + ng * 10 - 11] * exp(-(bs / xs + hk) / 2) * (exp(-hk * xs / (d__1 * d__1 * 2)) / rs - (c__ * xs * (d__ * xs + 1) + 1)); } bvn = -bvn / 6.283185307179586; } if (rho > 0.) { d__1 = - MAX(h,k); bvn += mvnphi(d__1); } else { bvn = -bvn; if (k > h) { if (h < 0.) { bvn = bvn + mvnphi(k) - mvnphi(h); } else { d__1 = - h; d__2 = - k; bvn = bvn + mvnphi(d__1) - mvnphi(d__2); } } } } return bvn; } /* bvu */ /************************************************************************** * * * Normal distribution probabilities accurate to 1d-15. * * Reference: J.L. Schonfelder, Math Comp 32(1978), pp 1232-1240. * * * **************************************************************************/ double mvnphi (double z) { static double a[44] = { .610143081923200417926465815756, -.434841272712577471828182820888,.176351193643605501125840298123, -.060710795609249414860051215825,.017712068995694114486147141191, -.004321119385567293818599864968,8.54216676887098678819832055e-4, -1.2715509060916274262889394e-4,1.1248167243671189468847072e-5, 3.13063885421820972630152e-7,-2.70988068537762022009086e-7, 3.0737622701407688440959e-8,2.515620384817622937314e-9, -1.02892992132031912759e-9,2.9944052119949939363e-11, 2.605178968726693629e-11,-2.634839924171969386e-12, -6.43404509890636443e-13,1.12457401801663447e-13, 1.7281533389986098e-14,-4.264101694942375e-15, -5.45371977880191e-16,1.58697607761671e-16,2.0899837844334e-17, -5.900526869409e-18,-9.41893387554e-19,2.1497735647e-19, 4.6660985008e-20,-7.243011862e-21,-2.387966824e-21,1.91177535e-22, 1.20482568e-22,-6.72377e-25,-5.747997e-24,-4.28493e-25, 2.44856e-25,4.3793e-26,-8.151e-27,-3.089e-27,9.3e-29,1.74e-28, 1.6e-29,-8e-30,-2e-30 }; /* Builtin functions */ double exp(double); /* Local variables */ double b; int i__; double p, t, bm, bp, xa; xa = fabs(z) / 1.414213562373095048801688724209; if (xa > 100.) { p = 0.; } else { t = (xa * 8 - 30) / (xa * 4 + 15); bm = 0.; b = 0.; for (i__ = 24; i__ >= 0; --i__) { bp = b; b = bm; bm = t * b - bp + a[i__]; } p = exp(-xa * xa) * (bm - bp) / 4; } if (z > 0.) { p = 1 - p; } return p; } /* mvnphi */ stk/src/stk_dominatedhv_mex.c0000644000000000000000000002412713156161544013550 0ustar /***************************************************************************** * * * Small (Matlab/Octave) Toolbox for Kriging * * * * Copyright Notice * * * * Copyright (C) 2015-2017 CentraleSupelec * * * * Author: Julien Bect * * * * Copying Permission Statement * * * * This file is part of * * * * STK: a Small (Matlab/Octave) Toolbox for Kriging * * (http://sourceforge.net/projects/kriging) * * * * STK 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. * * * * STK 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 STK. If not, see . * * * ****************************************************************************/ #include "stk_mex.h" #include "wfg.h" /* We assume in this file that OBJECTIVE is the same as double */ double compute_hv (mxArray* f, FRONT *buffer) { size_t i, j; /* loop indices */ size_t nb_points; /* number of points */ size_t nb_objectives; /* number of objectives */ double *data; /* pointer to input data */ double hv, t; /* hypervolume */ nb_points = mxGetM (f); if (nb_points == 0) return 0.0; nb_objectives = mxGetN (f); data = mxGetPr (f); if (nb_objectives == 0) { return 0.0; } else if (nb_objectives == 1) { /* one objective: return the max */ hv = 0; for (i = 0; i < nb_points; i++) { t = data[i]; if (t > hv) hv = t; } return hv; } else /* two ore more objectives */ { wfg_front_resize (buffer, nb_points, nb_objectives); for (i = 0; i < nb_points; i++) for (j = 0; j < nb_objectives; j++) buffer->points[i].objectives[j] = data[j * nb_points + i]; return wfg_compute_hv (buffer); } } void compute_decomposition (mxArray* f, FRONT *buffer, mxArray** sign, mxArray** xmin, mxArray** xmax) { size_t i, j; /* loop indices */ size_t nb_points; /* number of points */ size_t nb_objectives; /* number of objectives */ size_t rect_alloc; /* initial number of rectangles */ double t; /* aux variables */ double *data; /* pointer to input data */ RLIST* Rlist; /* list of hyper-rectangles */ double *sign_data, *xmin_data, *xmax_data; nb_points = mxGetM (f); nb_objectives = mxGetN (f); data = mxGetPr (f); if (nb_objectives == 0) { *sign = NULL; *xmin = NULL; *xmax = NULL; } else if (nb_points == 0) { *sign = mxCreateDoubleMatrix (0, 1, mxREAL); *xmin = mxCreateDoubleMatrix (0, nb_objectives, mxREAL); *xmax = mxCreateDoubleMatrix (0, nb_objectives, mxREAL); } else if (nb_objectives == 1) { t = data[0]; for (i = 1; i < nb_points; i++) t = ((data[i] > t) ? data[i] : t); *sign = mxCreateDoubleMatrix (1, 1, mxREAL); *xmin = mxCreateDoubleMatrix (1, 1, mxREAL); *xmax = mxCreateDoubleMatrix (1, 1, mxREAL); (mxGetPr (*sign))[0] = 1.0; (mxGetPr (*xmin))[0] = 0.0; (mxGetPr (*xmax))[0] = t; } else /* two ore more objectives */ { wfg_front_resize (buffer, nb_points, nb_objectives); for (i = 0; i < nb_points; i++) for (j = 0; j < nb_objectives; j++) buffer->points[i].objectives[j] = data[j * nb_points + i]; /* Rule of thumb: allocate initially for ((2 ^ nb_objectives) * nb_points) rectangles */ rect_alloc = nb_objectives; for (i = 0; i < nb_objectives; i++) rect_alloc *= 2; Rlist = Rlist_alloc (rect_alloc, nb_objectives); wfg_compute_decomposition (buffer, Rlist); *sign = mxCreateDoubleMatrix (Rlist->size, 1, mxREAL); *xmin = mxCreateDoubleMatrix (Rlist->size, nb_objectives, mxREAL); *xmax = mxCreateDoubleMatrix (Rlist->size, nb_objectives, mxREAL); sign_data = mxGetPr (*sign); xmin_data = mxGetPr (*xmin); xmax_data = mxGetPr (*xmax); /* TODO: optimize using transposed arrays for xmin, xmax (mxArrays + internally in the Rlist structure) */ for (i = 0; i < Rlist->size; i++) { sign_data[i] = (double) Rlist->sign[i]; for (j = 0; j < nb_objectives; j++) { xmin_data[j * Rlist->size + i] = Rlist->xmin[i][j]; xmax_data[j * Rlist->size + i] = Rlist->xmax[i][j]; } } Rlist_free (Rlist); } } #define Y_IN prhs[0] #define DO_DECOMPOSITION prhs[1] #define HV_OUT plhs[0] static const char* field_names[] = {"sign", "xmin", "xmax"}; void mexFunction (int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { size_t i; /* loop indices */ mxArray **fronts; /* fronts, as mxArray objects */ bool do_decomposition; /* do the decomposition or just return the volume ? */ FRONT buffer; /* front structure, as expected by WFG */ size_t nb_fronts; /* number of Pareto fronts */ size_t nb_points; /* number of points in a given front */ size_t nb_objectives; /* number of objectives for a given front */ size_t maxm = 0; /* maximum number of points in a front */ size_t maxn = 0; /* maximum number of objectives */ double *hv; /* computed hyper-volumes */ bool must_free_fronts; /* flag: do we need to free 'fronts' ? */ mxArray* sign; /* temp array of signs (do_decomposition = true) */ mxArray* xmin; /* temp array of lower bounds (do_decomposition = true) */ mxArray* xmax; /* temp array of upper bounds (do_decomposition = true) */ if (nlhs > 1) /* Check number of output arguments */ mexErrMsgTxt ("Too many output arguments."); if (nrhs != 2) /* Check number of input arguments */ mexErrMsgTxt ("Incorrect number of input arguments."); if (stk_is_realmatrix (Y_IN)) { nb_fronts = 1; fronts = (mxArray**) prhs; must_free_fronts = false; } else if (mxIsCell (Y_IN)) { nb_fronts = mxGetNumberOfElements (Y_IN); fronts = (mxArray**) mxMalloc (sizeof (mxArray*) * nb_fronts); for (i = 0; i < nb_fronts; i++) fronts[i] = mxGetCell (Y_IN, i); must_free_fronts = true; } else { mexErrMsgTxt ("Incorrect type for argin #1: cell or double expected."); nb_fronts = 0; /* avoids unitialized variable warning */ fronts = NULL; /* idem */ must_free_fronts = false; /* idem */ } if (mxIsLogicalScalar (DO_DECOMPOSITION)) { do_decomposition = (bool) *mxGetLogicals (DO_DECOMPOSITION); } else { mexErrMsgTxt ("Incorrect type for argin #2: logical scalar expected."); do_decomposition = false; /* avoids unitialized variable warning */ } /*--- Prepare fronts for WFG -----------------------------------------------*/ for (i = 0; i < nb_fronts; i++) { nb_points = mxGetM (fronts[i]); if (nb_points > maxm) maxm = nb_points; nb_objectives = mxGetN (fronts[i]); if (nb_objectives > maxn) maxn = nb_objectives; } wfg_front_init (&buffer, maxm, maxn); /* Allocate memory for WFG */ wfg_alloc (maxm, maxn); /*--- Compute hyper-volumes or decomposition -------------------------------*/ if (do_decomposition) { if (nb_fronts == 1) { HV_OUT = mxCreateStructMatrix (1, 1, 3, field_names); } else { HV_OUT = mxCreateStructArray (mxGetNumberOfDimensions (Y_IN), mxGetDimensions (Y_IN), 3, field_names); } for (i = 0; i < nb_fronts; i++) { compute_decomposition (fronts[i], &buffer, &sign, &xmin, &xmax); mxSetFieldByNumber (HV_OUT, i, 0, sign); mxSetFieldByNumber (HV_OUT, i, 1, xmin); mxSetFieldByNumber (HV_OUT, i, 2, xmax); } } else { if (nb_fronts == 1) { HV_OUT = mxCreateDoubleScalar (1); } else { HV_OUT = mxCreateNumericArray (mxGetNumberOfDimensions (Y_IN), mxGetDimensions (Y_IN), mxDOUBLE_CLASS, mxREAL); } hv = mxGetPr (HV_OUT); for (i = 0; i < nb_fronts; i++) hv[i] = compute_hv (fronts[i], &buffer); } /*--- Free memory ----------------------------------------------------------*/ wfg_free (maxm, maxn); wfg_front_destroy (&buffer); if (must_free_fronts) mxFree (fronts); } stk/src/stk_filldist_discr_mex.c0000644000000000000000000001142113156161544014235 0ustar /***************************************************************************** * * * Small (Matlab/Octave) Toolbox for Kriging * * * * Copyright Notice * * * * Copyright (C) 2015 CentraleSupelec * * Copyright (C) 2012 SUPELEC * * * * Author: Julien Bect * * * * Copying Permission Statement * * * * This file is part of * * * * STK: a Small (Matlab/Octave) Toolbox for Kriging * * (http://sourceforge.net/projects/kriging) * * * * STK 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. * * * * STK 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 STK. If not, see . * * * ****************************************************************************/ #include "stk_mex.h" #define X_IN prhs[0] /* input argument #1 */ #define Y_IN prhs[1] /* input argument #2 */ #define FILLDIST_OUT plhs[0] /* output argument #1 */ #define ARGMAX_OUT plhs[1] /* output argument #2 */ static double compute_filldist ( double* x, size_t nx, double* y, size_t ny, size_t dim, size_t* argmax ) { size_t i, j, k1, k2, j_max; double diff, sqdist_max, sqdist_j, sqdist_ij; j_max = 0; sqdist_max = 0.0; for (j = 0; j < ny; j++) { sqdist_j = 0; /* prevents a "may be uninitialized" warning */ /* Compute the sqdist from y(j, :) to the set x */ for (i = 0; i < nx; i++) { /* Compute the sqdist from y(j, :) to x(i, :) */ sqdist_ij = 0.0; for (k1 = i, k2 = j; k1 < dim * nx; k1 += nx, k2 += ny) { diff = x[k1] - y[k2]; sqdist_ij += diff * diff; } /* Update sqdist_j */ if ((i == 0) || (sqdist_ij < sqdist_j)) sqdist_j = sqdist_ij; } /* Update sqdist_max */ if (sqdist_j > sqdist_max) { j_max = j; sqdist_max = sqdist_j; } } *argmax = j_max; return sqrt(sqdist_max); } void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray*prhs[]) { size_t mx, my, dim, argmax; double filldist, *px, *py; if (nlhs > 2) mexErrMsgTxt("Too many output arguments."); if (nrhs != 2) mexErrMsgTxt("Incorrect number of input arguments (should be 2)."); if (mxIsComplex(X_IN) || mxIsComplex(Y_IN)) mexErrMsgTxt("The input arguments cannot be complex."); if ((!mxIsDouble(X_IN)) || (!mxIsDouble(Y_IN))) mexErrMsgTxt("The input argument must be of class 'double'."); /* Read the size of the input arguments */ mx = mxGetM(X_IN); my = mxGetM(Y_IN); dim = mxGetN(X_IN); if ((mx == 0) || (my == 0) || (dim == 0)) mexErrMsgTxt("The input arguments should not be empty."); if (mxGetN(Y_IN) != dim) mexErrMsgTxt("The input arguments must have the same number of columns."); /* Do the actual computations in a subroutine */ px = mxGetPr(X_IN); py = mxGetPr(Y_IN); filldist = compute_filldist(px, mx, py, my, dim, &argmax); /* Return the results as Matlab objects */ FILLDIST_OUT = mxCreateDoubleScalar(filldist); if (nlhs == 2) ARGMAX_OUT = mxCreateDoubleScalar(((double)argmax) + 1); } stk/src/stk_gpquadform_matrixx.c0000644000000000000000000001066413156161544014317 0ustar /***************************************************************************** * * * Small (Matlab/Octave) Toolbox for Kriging * * * * Copyright Notice * * * * Copyright (C) 2015 CentraleSupelec * * Copyright (C) 2013 SUPELEC * * * * Author: Julien Bect * * * * Copying Permission Statement * * * * This file is part of * * * * STK: a Small (Matlab/Octave) Toolbox for Kriging * * (http://sourceforge.net/projects/kriging) * * * * STK 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. * * * * STK 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 STK. If not, see . * * * ****************************************************************************/ #include "stk_mex.h" static void gpquadform_matrixx ( double* x, double* rx2, double* h, size_t n, size_t dim ) { size_t i, j, k1, k2; double diff, lambda; for (i = 0; i < (n - 1); i++) { /* put a zero on the diagonal */ h[i * (n + 1)] = 0.0; for (j = (i + 1); j < n; j++) { /* compute distance between x[i,:] and x[j,:] */ lambda = 0.0; for (k1 = i, k2 = j; k1 < dim * n; k1 += n, k2 += n) { diff = x[k1] - x[k2]; lambda += (diff * diff) / (rx2[k1] + rx2[k2]); } /* store the result in h */ h[i + n * j] = lambda; h[j + n * i] = lambda; } } } mxArray* compute_gpquadform_matrixx ( const mxArray* x, const mxArray* rx ) { size_t k, d, mx; double u, *p, *rx2; mxArray *h; if((!stk_is_realmatrix(x)) || (!stk_is_realmatrix(rx))) mexErrMsgTxt("Input arguments should be real-valued double-precision array."); d = mxGetN(x); mx = mxGetM(x); /* Check that the all input arguments have the same number of columns */ if ((mxGetM(rx) != mx) || (mxGetN(rx) != d)) mexErrMsgTxt("x and rx should have the same size."); /* Compute rx^2 */ rx2 = mxCalloc(mx * d, sizeof(double)); p = mxGetPr(rx); for(k = 0; k < mx * d; k++) { u = p[k]; if(u <= 0) mexErrMsgTxt("rx should have (strictly) positive entries."); rx2[k] = u * u; } /* Create a matrix for the return argument */ h = mxCreateDoubleMatrix(mx, mx, mxREAL); /* Do the actual computations in a subroutine */ gpquadform_matrixx(mxGetPr(x), rx2, mxGetPr(h), mx, d); /* Free allocated memory */ mxFree(rx2); return h; } void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray*prhs[]) { if (nlhs > 1) /* Check number of output arguments */ mexErrMsgTxt("Too many output arguments."); if (nrhs != 2) /* Check number of input arguments */ mexErrMsgTxt("Incorrect number of input arguments."); plhs[0] = compute_gpquadform_matrixx(prhs[0], prhs[1]); } stk/src/stk_gpquadform_matrixy.c0000644000000000000000000001210613156161544014311 0ustar /***************************************************************************** * * * Small (Matlab/Octave) Toolbox for Kriging * * * * Copyright Notice * * * * Copyright (C) 2015 CentraleSupelec * * Copyright (C) 2013 SUPELEC * * * * Author: Julien Bect * * * * Copying Permission Statement * * * * This file is part of * * * * STK: a Small (Matlab/Octave) Toolbox for Kriging * * (http://sourceforge.net/projects/kriging) * * * * STK 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. * * * * STK 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 STK. If not, see . * * * ****************************************************************************/ #include "stk_mex.h" static void gpquadfrom_matrixy ( double* x, double* y, double* rx2, double* ry2, double* h, size_t nx, size_t ny, size_t dim ) { size_t i, j, kx, ky; double diff, lambda; for (i = 0; i < nx; i++) { for (j = 0; j < ny; j++) { /* compute distance between x[i,:] and y[j,:] */ lambda = 0.0; for (kx = i, ky = j; kx < dim * nx; kx += nx, ky += ny) { diff = x[kx] - y[ky]; lambda += (diff * diff) / (rx2[kx] + ry2[ky]); } /* store the result in h */ h[i + nx * j] = lambda; } } } mxArray* compute_gpquadfrom_matrixy ( const mxArray* x, const mxArray* y, const mxArray* rx, const mxArray* ry ) { size_t k, d, mx, my; double u, *p, *rx2, *ry2; mxArray *h; if((!stk_is_realmatrix(x)) || (!stk_is_realmatrix(y)) || (!stk_is_realmatrix(rx)) || (!stk_is_realmatrix(ry))) mexErrMsgTxt("Input arguments should be real-valued double-precision array."); /* Check that the all input arguments have the same number of columns */ d = mxGetN(x); if ((mxGetN(y) != d) || (mxGetN(rx) != d) || (mxGetN(ry) != d)) mexErrMsgTxt("All input arguments should have the same number of columns."); /* Check that rx and ry have the appropriate number of rows */ if (mxGetM(rx) != (mx = mxGetM(x))) mexErrMsgTxt("x and rx should have the same number of rows."); if (mxGetM(ry) != (my = mxGetM(y))) mexErrMsgTxt("y and ry should have the same number of rows."); /* Compute rx^2 */ rx2 = mxCalloc(mx * d, sizeof(double)); p = mxGetPr(rx); for(k = 0; k < mx * d; k++) { u = p[k]; if(u <= 0) mexErrMsgTxt("rx should have (strictly) positive entries."); rx2[k] = u * u; } /* Compute ry^2 */ ry2 = mxCalloc(my * d, sizeof(double)); p = mxGetPr(ry); for(k = 0; k < my * d; k++) { u = p[k]; if(u <= 0) mexErrMsgTxt("ry should have (strictly) positive entries."); ry2[k] = u * u; } /* Create a matrix for the return argument */ h = mxCreateDoubleMatrix(mx, my, mxREAL); /* Do the actual computations in a subroutine */ gpquadfrom_matrixy(mxGetPr(x), mxGetPr(y), rx2, ry2, mxGetPr(h), mx, my, d); /* Free allocated memory */ mxFree(rx2); mxFree(ry2); return h; } void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray*prhs[]) { if (nlhs > 1) /* Check number of output arguments */ mexErrMsgTxt("Too many output arguments."); if (nrhs != 4) /* Check number of input arguments */ mexErrMsgTxt("Incorrect number of input arguments."); plhs[0] = compute_gpquadfrom_matrixy(prhs[0], prhs[1], prhs[2], prhs[3]); } stk/src/stk_gpquadform_pairwise.c0000644000000000000000000001114113156161544014435 0ustar /***************************************************************************** * * * Small (Matlab/Octave) Toolbox for Kriging * * * * Copyright Notice * * * * Copyright (C) 2015 CentraleSupelec * * Copyright (C) 2013 SUPELEC * * * * Author: Julien Bect * * * * Copying Permission Statement * * * * This file is part of * * * * STK: a Small (Matlab/Octave) Toolbox for Kriging * * (http://sourceforge.net/projects/kriging) * * * * STK 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. * * * * STK 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 STK. If not, see . * * * ****************************************************************************/ #include "stk_mex.h" static void gpquadform_pairwise ( double* x, double* y, double* rx, double* ry, double* h, size_t m, size_t dim ) { size_t i, kx, ky; double diff, lambda, rxi, ryi; for (i = 0; i < m; i++) { /* compute distance between x[i,:] and y[i,:] */ lambda = 0.0; for (kx = i, ky = i; kx < dim * m; kx += m, ky += m) { diff = x[kx] - y[ky]; rxi = rx[kx]; ryi = ry[ky]; lambda += (diff * diff) / (rxi * rxi + ryi * ryi); } /* store the result in h */ h[i] = lambda; } } mxArray* compute_qxy_matrixy ( const mxArray* x, const mxArray* y, const mxArray* rx, const mxArray* ry ) { size_t d, m; mxArray *h; if((!stk_is_realmatrix(x)) || (!stk_is_realmatrix(y)) || (!stk_is_realmatrix(rx)) || (!stk_is_realmatrix(ry))) mexErrMsgTxt("Input arguments should be real-valued double-precision array."); /* Check that the all input arguments have the same number of columns */ d = mxGetN(x); if ((mxGetN(y) != d) || (mxGetN(rx) != d) || (mxGetN(ry) != d)) mexErrMsgTxt("All input arguments should have the same number of columns."); /* Read the number of rows of x and y */ if (mxGetM(y) != (m = mxGetM(x))) mexErrMsgTxt("x and y should have the same number of rows."); /* Check that rx and ry have the appropriate number of rows */ if (mxGetM(rx) != m) mexErrMsgTxt("x and rx should have the same number of rows."); if (mxGetM(ry) != m) mexErrMsgTxt("y and ry should have the same number of rows."); /* Create a matrix for the return argument */ h = mxCreateDoubleMatrix(m, 1, mxREAL); /* Do the actual computations in a subroutine */ gpquadform_pairwise(mxGetPr(x), mxGetPr(y), mxGetPr(rx), mxGetPr(ry), mxGetPr(h), m, d); return h; } void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray*prhs[]) { if (nlhs > 1) /* Check number of output arguments */ mexErrMsgTxt("Too many output arguments."); if (nrhs != 4) /* Check number of input arguments */ mexErrMsgTxt("Incorrect number of input arguments."); plhs[0] = compute_qxy_matrixy(prhs[0], prhs[1], prhs[2], prhs[3]); } stk/src/stk_isdominated_mex.c0000644000000000000000000001127613156161544013547 0ustar /***************************************************************************** * * * Small (Matlab/Octave) Toolbox for Kriging * * * * Copyright Notice * * * * Copyright (C) 2014 SUPELEC * * * * Author: Julien Bect * * * * Copying Permission Statement * * * * This file is part of * * * * STK: a Small (Matlab/Octave) Toolbox for Kriging * * (http://sourceforge.net/projects/kriging) * * * * STK 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. * * * * STK 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 STK. If not, see . * * * ****************************************************************************/ #include "stk_mex.h" typedef double SCALAR; typedef mxLogical LOGICAL; #include "pareto.h" /* mimic ismember's syntax */ #define ARGIN_A prhs[0] /* n x d, double */ #define ARGIN_B prhs[1] /* k x d, double */ #define ARGOUT_ISDOM plhs[0] /* n x 1, logical */ #define ARGOUT_DRANK plhs[1] /* n x 1, double */ /* IMPORTANT: the rows of B are assumed to be */ /* SORTED in the LEXICAL ORDER */ void mexFunction ( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[] ) { int i, n, k, d, *tmp_drank; double *xa, *xb, *drank; mxLogical *isdom; /*--- Check number of input/output arguments --------------------*/ if (nrhs != 2) /* Check number of input arguments */ mexErrMsgTxt ("Incorrect number of input arguments."); if (nlhs > 2) /* Check number of output arguments */ mexErrMsgTxt ("Too many output arguments."); /*--- Check input types -----------------------------------------*/ if (! stk_is_realmatrix (ARGIN_A)) mexErrMsgTxt ("The first input argument should be a " "real-valued double-precision array."); xa = mxGetPr (ARGIN_A); if (! stk_is_realmatrix (ARGIN_B)) mexErrMsgTxt ("The second input argument should be a " "real-valued double-precision array."); xb = mxGetPr (ARGIN_B); /*--- Read dimensions -------------------------------------------*/ n = (int) mxGetM (ARGIN_A); d = (int) mxGetN (ARGIN_A); k = (int) mxGetM (ARGIN_B); if (d != mxGetN (ARGIN_B)) mexErrMsgTxt ("The two input arguments should have the " "same number of columns"); /*--- Create arrays ---------------------------------------------*/ ARGOUT_ISDOM = mxCreateLogicalMatrix (n, 1); isdom = mxGetLogicals (ARGOUT_ISDOM); tmp_drank = (int *) mxCalloc (n, sizeof (int)); /*--- Find dominated rows ---------------------------------------*/ is_dominated (xa, xb, isdom, tmp_drank, n, k, d); if (nlhs > 1) { ARGOUT_DRANK = mxCreateDoubleMatrix (n, 1, mxREAL); drank = mxGetPr (ARGOUT_DRANK); for (i = 0; i < n; i++) drank[i] = (double) (1 + tmp_drank[i]); } /*--- Cleanup --------------------------------------------------*/ mxFree (tmp_drank); } stk/src/stk_mex.h0000644000000000000000000001002013156161544011156 0ustar /***************************************************************************** * * * Small (Matlab/Octave) Toolbox for Kriging * * * * Copyright Notice * * * * Copyright (C) 2015 CentraleSupelec * * Copyright (C) 2012, 2013 SUPELEC * * * * Author: Julien Bect * * * * Copying Permission Statement * * * * This file is part of * * * * STK: a Small (Matlab/Octave) Toolbox for Kriging * * (http://sourceforge.net/projects/kriging) * * * * STK 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. * * * * STK 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 STK. If not, see . * * * ****************************************************************************/ #ifndef ___STK_MEX_H___ #define ___STK_MEX_H___ #include #include "mex.h" #if (defined __STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) # include #else # ifndef bool # define bool int # endif # ifndef true # define true 1 # endif # ifndef false # define false 0 # endif #endif int stk_is_realmatrix(const mxArray* x) { if (mxIsComplex(x) || !mxIsDouble(x)) return 0; if (mxGetNumberOfDimensions(x) != 2) return 0; return 1; } int mxIsDoubleVector (const mxArray* x) { size_t m, n; if (! stk_is_realmatrix (x)) return 0; m = mxGetM (x); n = mxGetN (x); return ((m == 1) && (n > 0)) || ((n == 1) && (m > 0)); } void mxReplaceField (mxArray* S, mwIndex index, const char* fieldname, const mxArray* value) { mxArray *tmp, *value_copy; tmp = mxGetField(S, index, fieldname); if (tmp != NULL) mxDestroyArray(tmp); value_copy = mxDuplicateArray(value); if (value_copy == NULL) mexErrMsgTxt("mxDuplicateArray: not enough free heap " "space to create the mxArray"); mxSetField(S, index, fieldname, value_copy); } #define STK_OK 0 #define STK_ERROR -1 #define STK_ERROR_DOMAIN 1 #define STK_ERROR_OOM 2 #define STK_ERROR_SANITY 3 int mxReadScalar_int(const mxArray* x, int* n) { double t; if (mxGetNumberOfElements(x) != 1) return STK_ERROR; if (mxIsComplex(x) || !mxIsDouble(x)) return STK_ERROR; t = mxGetScalar(x); *n = (int) t; return ((((double) *n) == t) ? STK_OK : STK_ERROR); } #endif stk/src/stk_mindist_mex.c0000644000000000000000000001022713156161544012711 0ustar /***************************************************************************** * * * Small (Matlab/Octave) Toolbox for Kriging * * * * Copyright Notice * * * * Copyright (C) 2015 CentraleSupelec * * Copyright (C) 2012 SUPELEC * * * * Author: Julien Bect * * * * Copying Permission Statement * * * * This file is part of * * * * STK: a Small (Matlab/Octave) Toolbox for Kriging * * (http://sourceforge.net/projects/kriging) * * * * STK 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. * * * * STK 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 STK. If not, see . * * * ****************************************************************************/ #include "stk_mex.h" #define X_IN prhs[0] /* input argument */ #define H_OUT plhs[0] /* output argument */ static double compute_mindist(double* x, size_t nx, size_t dim) { size_t i, j, k1, k2; double diff, dist_squared, mindist_squared; mindist_squared = -1; for (i = 0; i < nx; i++) { for (j = i+1; j < nx; j++) { /* compute distance between x[i,:] and x[j,:] */ dist_squared = 0.0; for (k1 = i, k2 = j; k1 < dim * nx; k1 += nx, k2 += nx) { diff = x[k1] - x[k2]; dist_squared += diff * diff; } /* update mindist_squared */ if ((dist_squared < mindist_squared) || (mindist_squared < 0)) mindist_squared = dist_squared; } } return sqrt(mindist_squared); } void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray*prhs[]) { size_t dim, mx; if (nlhs > 1) mexErrMsgTxt("Too many output arguments."); if (nrhs != 1) mexErrMsgTxt("Incorrect number of input arguments (should be 1)."); if (mxIsComplex(X_IN)) mexErrMsgTxt("The input argument cannot be complex."); if (!mxIsDouble(X_IN)) mexErrMsgTxt("The input argument must be of class 'double'."); /* Read the size of the input argument */ mx = mxGetM(X_IN); dim = mxGetN(X_IN); if (mx < 2) { /* return an empty matrix if the input has less than two lines */ H_OUT = mxCreateDoubleMatrix(0, 0, mxREAL); } else { if (dim == 0) { /* return zero distance if the matrix has no columns */ H_OUT = mxCreateDoubleScalar(0.0); } else { /* otherwise, do the actual computations in a subroutine */ H_OUT = mxCreateDoubleScalar(compute_mindist(mxGetPr(X_IN), mx, dim)); } } } stk/src/stk_paretofind_mex.c0000644000000000000000000000775513156161544013411 0ustar /***************************************************************************** * * * Small (Matlab/Octave) Toolbox for Kriging * * * * Copyright Notice * * * * Copyright (C) 2014 SUPELEC * * * * Author: Julien Bect * * * * Copying Permission Statement * * * * This file is part of * * * * STK: a Small (Matlab/Octave) Toolbox for Kriging * * (http://sourceforge.net/projects/kriging) * * * * STK 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. * * * * STK 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 STK. If not, see . * * * ****************************************************************************/ #include "stk_mex.h" typedef double SCALAR; typedef mxLogical LOGICAL; #include "pareto.h" #define ARGIN_X prhs[0] #define ARGOUT_NDPOS plhs[0] #define ARGOUT_DRANK plhs[1] void mexFunction ( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[] ) { int i, k, n, d, *tmp_ndpos, *tmp_drank; double *x, *ndpos, *drank; if (nrhs != 1) /* Check number of input arguments */ mexErrMsgTxt ("Incorrect number of input arguments."); if (nlhs > 3) /* Check number of output arguments */ mexErrMsgTxt ("Too many output arguments."); if (! stk_is_realmatrix (ARGIN_X)) mexErrMsgTxt ("The input should be a real-valued " "double-precision array."); /* Read input argument */ n = mxGetM (ARGIN_X); d = mxGetN (ARGIN_X); x = mxGetPr (ARGIN_X); /* Create a temporary arrays */ tmp_ndpos = (int *) mxCalloc (n, sizeof (int)); tmp_drank = (int *) mxCalloc (n, sizeof (int)); /* PRUNE */ k = pareto_find (x, tmp_ndpos, tmp_drank, n, d); /* ARGOUT #1: position of non-dominated points, in lexical order */ ARGOUT_NDPOS = mxCreateDoubleMatrix (k, 1, mxREAL); ndpos = mxGetPr (ARGOUT_NDPOS); for (i = 0; i < k; i++) ndpos[i] = (double) (1 + tmp_ndpos[i]); /* ARGOUT #2: rank of first dominating point */ if (nlhs > 1) { ARGOUT_DRANK = mxCreateDoubleMatrix (n, 1, mxREAL); drank = mxGetPr (ARGOUT_DRANK); for (i = 0; i < n; i++) drank[i] = (double) (1 + tmp_drank[i]); } /* Cleanup */ mxFree (tmp_ndpos); mxFree (tmp_drank); } stk/src/stk_sampling_sobol_mex.c0000644000000000000000000021121613156161544014253 0ustar /***************************************************************************** * * * Small (Matlab/Octave) Toolbox for Kriging * * * * Copyright Notice * * * * Copyright (C) 2016 CentraleSupelec * * * * Author: Julien Bect * * * * The Sobol sequence implementation contained in this file is due to * * Steven G. Johnson and was obtained from the NLopt toolbox, v2.4.2, * * released under the MIT licence. The original copyright notice was * * as follows: * * * * Copyright (c) 2007 Massachusetts Institute of Technology * * * * A copy of the original (MIT) licence is included below. * * * * Copying Permission Statement * * * * This file is part of * * * * STK: a Small (Matlab/Octave) Toolbox for Kriging * * (http://sourceforge.net/projects/kriging) * * * * STK 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. * * * * STK 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 STK. If not, see . * * * ****************************************************************************/ #include #include #include #include "stk_mex.h" /* Sobol' low-discrepancy-sequence generation */ typedef struct nlopt_soboldata_s *nlopt_sobol; static nlopt_sobol nlopt_sobol_create (unsigned int sdim); static void nlopt_sobol_destroy (nlopt_sobol s); static void nlopt_sobol_skip (nlopt_sobol s, unsigned int n, double *x); static int nlopt_sobol_gen (nlopt_sobol s, double *x); /***************************************************************************** * * * MEX entry point (mexFunction) * * * * CALL: X = stk_sampling_sobol_mex (N, DIM, DO_SKIP) * * * ****************************************************************************/ #define N_IN prhs[0] #define DIM_IN prhs[1] #define DO_SKIP_IN prhs[2] #define X_OUT plhs[0] void mexFunction (int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { int n_, dim_, i; unsigned int n, dim; double *h; nlopt_sobol s; bool do_skip; n_ = 0; dim_ = 0; /*--- Read input arguments -----------------------------------------------*/ if (nrhs < 3) mexErrMsgIdAndTxt ("STK:stk_sampling_sobol_mex:NotEnoughInputArgs", "Not enough input arguments (exactly two required)."); else if (nrhs > 3) mexErrMsgIdAndTxt ("STK:stk_sampling_sobol_mex:TooManyInputArgs", "Too many input arguments (exactly two required)."); if ((mxReadScalar_int (N_IN, &n_) != 0) || (n_ <= 0)) mexErrMsgIdAndTxt ("STK:stk_sampling_sobol_mex:IncorrectArgument", "First argument (n) must be a strictly positive " "scalar integer."); n = (unsigned int) n_; if (n > 4294967295U) mexErrMsgIdAndTxt ("STK:stk_sampling_sobol_mex:IncorrectArgument", "This is a 32-bits implementation of the Sobol " "sequence: it cannot generate more than 2^32 - 1" "terms"); if ((mxReadScalar_int (DIM_IN, &dim_) != 0) || (dim_ <= 0)) mexErrMsgIdAndTxt ("STK:stk_sampling_sobol_mex:IncorrectArgument", "Second argument (dim) must be a scrictly positive " "scalar integer."); dim = (unsigned int) dim_; if (dim > 1111) mexErrMsgIdAndTxt ("STK:stk_sampling_sobol_mex:IncorrectArgument", "This implementation is restricted to dim <= 1111."); if (! mxIsLogicalScalar (DO_SKIP_IN)) mexErrMsgIdAndTxt ("STK:stk_sampling_sobol_mex:IncorrectArgument", "Third argument (do_skip) must be a logical scalar."); do_skip = mxIsLogicalScalarTrue (DO_SKIP_IN); /*--- Generate a segment of the Sobol sequence ---------------------------*/ X_OUT = mxCreateDoubleMatrix (dim, n, mxREAL); h = mxGetPr (X_OUT); s = nlopt_sobol_create (dim); if (do_skip) nlopt_sobol_skip (s, n, h); for (i = 0; i < n; i++, h += dim) nlopt_sobol_gen (s, h); nlopt_sobol_destroy (s); } /* Copyright (c) 2007 Massachusetts Institute of Technology * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /* Generation of Sobol sequences in up to 1111 dimensions, based on the algorithms described in: P. Bratley and B. L. Fox, Algorithm 659, ACM Trans. Math. Soft. 14 (1), 88-100 (1988), as modified by: S. Joe and F. Y. Kuo, ACM Trans. Math. Soft 29 (1), 49-57 (2003). Note that the code below was written without even looking at the Fortran code from the TOMS paper, which is only semi-free (being under the restrictive ACM copyright terms). Then I went to the Fortran code and took out the table of primitive polynomials and starting direction #'s ... since this is just a table of numbers generated by a deterministic algorithm, it is not copyrightable. (Obviously, the format of these tables then necessitated some slight modifications to the code.) For the test integral of Joe and Kuo (see the main() program below), I get exactly the same results for integrals up to 1111 dimensions compared to the table of published numbers (to the 5 published significant digits). This is not to say that the authors above should not be credited for their clear description of the algorithm (and their tabulation of the critical numbers). Please cite them. Just that I needed a free/open-source implementation. */ #if UINT_MAX == 4294967295U typedef unsigned int uint32_t; #elif ULONG_MAX == 4294967295U typedef unsigned long uint32_t; #else # error No 32-bit unsigned integer type #endif typedef struct nlopt_soboldata_s { unsigned sdim; /* dimension of sequence being generated */ uint32_t *mdata; /* array of length 32 * sdim */ uint32_t *m[32]; /* more convenient pointers to mdata, of direction #s */ uint32_t *x; /* previous x = x_n, array of length sdim */ unsigned *b; /* position of fixed point in x[i] is after bit b[i] */ uint32_t n; /* number of x's generated so far */ } soboldata; /* Return position (0, 1, ...) of rightmost (least-significant) zero bit in n. * * This code uses a 32-bit version of algorithm to find the rightmost * one bit in Knuth, _The Art of Computer Programming_, volume 4A * (draft fascicle), section 7.1.3, "Bitwise tricks and * techniques." * * Assumes n has a zero bit, i.e. n < 2^32 - 1. * */ static unsigned rightzero32(uint32_t n) { #if defined(__GNUC__) && \ ((__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || __GNUC__ > 3) return __builtin_ctz(~n); /* gcc builtin for version >= 3.4 */ #else const uint32_t a = 0x05f66a47; /* magic number, found by brute force */ static const unsigned decode[32] = {0,1,2,26,23,3,15,27,24,21,19,4,12,16, 28,6,31,25,22,14,20,18,11,5,30,13,17, 10,29,9,8,7}; n = ~n; /* change to rightmost-one problem */ n = a * (n & (-n)); /* store in n to make sure mult. is 32 bits */ return decode[n >> 27]; #endif } /* generate the next term x_{n+1} in the Sobol sequence, as an array x[sdim] of numbers in (0,1). Returns 1 on success, 0 on failure (if too many #'s generated) */ int nlopt_sobol_gen(soboldata *sd, double *x) { unsigned c, b, i, sdim; if (sd->n == 4294967295U) return 0; /* n == 2^32 - 1 ... we would need to switch to a 64-bit version to generate more terms. */ c = rightzero32(sd->n++); sdim = sd->sdim; for (i = 0; i < sdim; ++i) { b = sd->b[i]; if (b >= c) { sd->x[i] ^= sd->m[c][i] << (b - c); x[i] = ((double) (sd->x[i])) / (1U << (b+1)); } else { sd->x[i] = (sd->x[i] << (c - b)) ^ sd->m[c][i]; sd->b[i] = c; x[i] = ((double) (sd->x[i])) / (1U << (c+1)); } } return 1; } /* Data on the primitive binary polynomials (a) and the corresponding starting values m, for Sobol sequences in up to 1111 dimensions, taken from: P. Bratley and B. L. Fox, Algorithm 659, ACM Trans. Math. Soft. 14 (1), 88-100 (1988), as modified by: S. Joe and F. Y. Kuo, ACM Trans. Math. Soft 29 (1), 49-57 (2003). */ #define MAXDIM 1111 #define MAXDEG 12 /* successive primitive binary-coefficient polynomials p(z) = a_0 + a_1 z + a_2 z^2 + ... a_31 z^31, where a_i is the i-th bit of sobol_a[j] for the j-th polynomial. */ static const uint32_t sobol_a[MAXDIM-1] = { 3,7,11,13,19,25,37,59,47,61,55,41,67,97,91, 109,103,115,131,193,137,145,143,241,157,185,167,229,171,213, 191,253,203,211,239,247,285,369,299,301,333,351,355,357,361, 391,397,425,451,463,487,501,529,539,545,557,563,601,607,617, 623,631,637,647,661,675,677,687,695,701,719,721,731,757,761, 787,789,799,803,817,827,847,859,865,875,877,883,895,901,911, 949,953,967,971,973,981,985,995,1001,1019,1033,1051,1063, 1069,1125,1135,1153,1163,1221,1239,1255,1267,1279,1293,1305, 1315,1329,1341,1347,1367,1387,1413,1423,1431,1441,1479,1509, 1527,1531,1555,1557,1573,1591,1603,1615,1627,1657,1663,1673, 1717,1729,1747,1759,1789,1815,1821,1825,1849,1863,1869,1877, 1881,1891,1917,1933,1939,1969,2011,2035,2041,2053,2071,2091, 2093,2119,2147,2149,2161,2171,2189,2197,2207,2217,2225,2255, 2257,2273,2279,2283,2293,2317,2323,2341,2345,2363,2365,2373, 2377,2385,2395,2419,2421,2431,2435,2447,2475,2477,2489,2503, 2521,2533,2551,2561,2567,2579,2581,2601,2633,2657,2669, 2681,2687,2693,2705,2717,2727,2731,2739, 2741,2773,2783,2793,2799,2801,2811,2819,2825,2833,2867,2879, 2881,2891,2905,2911,2917,2927,2941,2951,2955,2963,2965,2991, 2999,3005,3017,3035,3037,3047,3053,3083,3085,3097,3103,3159, 3169,3179,3187,3205,3209,3223,3227,3229,3251,3263,3271,3277, 3283,3285,3299,3305,3319,3331,3343,3357,3367,3373,3393,3399, 3413,3417,3427,3439,3441,3475,3487,3497,3515,3517,3529,3543, 3547,3553,3559,3573,3589,3613,3617,3623,3627,3635,3641,3655, 3659,3669,3679,3697,3707,3709,3713,3731,3743,3747,3771,3791, 3805,3827,3833,3851,3865,3889,3895,3933,3947,3949,3957,3971, 3985,3991,3995,4007,4013,4021,4045,4051,4069,4073,4179,4201, 4219,4221,4249,4305,4331,4359,4383,4387,4411,4431,4439,4449, 4459,4485,4531,4569,4575,4621,4663,4669,4711,4723,4735,4793, 4801,4811,4879,4893,4897,4921,4927,4941,4977,5017,5027,5033, 5127,5169,5175,5199,5213,5223,5237,5287,5293,5331,5391,5405, 5453,5523,5573,5591,5597,5611,5641,5703,5717,5721,5797,5821, 5909,5913, 5955,5957,6005,6025,6061,6067,6079,6081, 6231,6237,6289,6295,6329,6383,6427,6453,6465,6501,6523,6539, 6577,6589,6601,6607,6631,6683,6699,6707,6761,6795,6865,6881, 6901,6923,6931,6943,6999,7057,7079,7103,7105,7123,7173,7185, 7191,7207,7245,7303,7327,7333,7355,7365,7369,7375,7411,7431, 7459,7491,7505,7515,7541,7557,7561,7701,7705,7727,7749,7761, 7783,7795,7823,7907,7953,7963,7975,8049,8089,8123,8125,8137, 8219,8231,8245,8275,8293,8303,8331,8333,8351,8357,8367,8379, 8381,8387,8393,8417,8435,8461,8469,8489,8495,8507,8515,8551, 8555,8569,8585,8599,8605,8639,8641,8647,8653,8671,8675,8689, 8699,8729,8741,8759,8765,8771,8795,8797,8825,8831,8841,8855, 8859,8883,8895,8909,8943,8951,8955,8965,8999,9003,9031,9045, 9049,9071,9073,9085,9095,9101,9109,9123,9129,9137,9143,9147, 9185,9197,9209,9227,9235,9247,9253,9257,9277,9297,9303,9313, 9325,9343,9347,9371,9373,9397,9407,9409,9415,9419,9443,9481, 9495,9501,9505,9517,9529,9555,9557,9571,9585,9591,9607,9611, 9621,9625, 9631,9647,9661,9669,9679,9687,9707,9731, 9733,9745,9773,9791,9803,9811,9817,9833,9847,9851,9863,9875, 9881,9905,9911,9917,9923,9963,9973,10003,10025,10043,10063, 10071,10077,10091,10099,10105,10115,10129,10145,10169,10183, 10187,10207,10223,10225,10247,10265,10271,10275,10289,10299, 10301,10309,10343,10357,10373,10411,10413,10431,10445,10453, 10463,10467,10473,10491,10505,10511,10513,10523,10539,10549, 10559,10561,10571,10581,10615,10621,10625,10643,10655,10671, 10679,10685,10691,10711,10739,10741,10755,10767,10781,10785, 10803,10805,10829,10857,10863,10865,10875,10877,10917,10921, 10929,10949,10967,10971,10987,10995,11009,11029,11043,11045, 11055,11063,11075,11081,11117,11135,11141,11159,11163,11181, 11187,11225,11237,11261,11279,11297,11307,11309,11327,11329, 11341,11377,11403,11405,11413,11427,11439,11453,11461,11473, 11479,11489,11495,11499,11533,11545,11561,11567,11575,11579, 11589,11611,11623,11637,11657,11663,11687,11691,11701,11747, 11761,11773,11783,11795,11797,11817,11849,11855,11867,11869, 11873,11883,11919, 11921,11927,11933,11947,11955,11961, 11999,12027,12029,12037,12041,12049,12055,12095,12097,12107, 12109,12121,12127,12133,12137,12181,12197,12207,12209,12239, 12253,12263,12269,12277,12287,12295,12309,12313,12335,12361, 12367,12391,12409,12415,12433,12449,12469,12479,12481,12499, 12505,12517,12527,12549,12559,12597,12615,12621,12639,12643, 12657,12667,12707,12713,12727,12741,12745,12763,12769,12779, 12781,12787,12799,12809,12815,12829,12839,12857,12875,12883, 12889,12901,12929,12947,12953,12959,12969,12983,12987,12995, 13015,13019,13031,13063,13077,13103,13137,13149,13173,13207, 13211,13227,13241,13249,13255,13269,13283,13285,13303,13307, 13321,13339,13351,13377,13389,13407,13417,13431,13435,13447, 13459,13465,13477,13501,13513,13531,13543,13561,13581,13599, 13605,13617,13623,13637,13647,13661,13677,13683,13695,13725, 13729,13753,13773,13781,13785,13795,13801,13807,13825,13835, 13855,13861,13871,13883,13897,13905,13915,13939,13941,13969, 13979,13981,13997,14027,14035,14037,14051,14063,14085,14095, 14107,14113,14125,14137,14145, 14151,14163,14193,14199,14219,14229, 14233,14243,14277,14287,14289,14295,14301,14305,14323,14339, 14341,14359,14365,14375,14387,14411,14425,14441,14449,14499, 14513,14523,14537,14543,14561,14579,14585,14593,14599,14603, 14611,14641,14671,14695,14701,14723,14725,14743,14753,14759, 14765,14795,14797,14803,14831,14839,14845,14855,14889,14895, 14909,14929,14941,14945,14951,14963,14965,14985,15033,15039, 15053,15059,15061,15071,15077,15081,15099,15121,15147,15149, 15157,15167,15187,15193,15203,15205,15215,15217,15223,15243, 15257,15269,15273,15287,15291,15313,15335,15347,15359,15373, 15379,15381,15391,15395,15397,15419,15439,15453,15469,15491, 15503,15517,15527,15531,15545,15559,15593,15611,15613,15619, 15639,15643,15649,15661,15667,15669,15681,15693,15717,15721, 15741,15745,15765,15793,15799,15811,15825,15835,15847,15851, 15865,15877,15881,15887,15899,15915,15935,15937,15955,15973, 15977,16011,16035,16061,16069,16087,16093,16097,16121,16141, 16153,16159,16165,16183,16189,16195,16197,16201,16209,16215, 16225,16259,16265,16273,16299, 16309,16355,16375,16381, }; /* starting direction #'s m[i] = sobol_minit[i][j] for i=0..d of the * degree-d primitive polynomial sobol_a[j]. */ static const uint32_t sobol_minit[MAXDEG+1][MAXDIM-1] = { /* [0][*] */ { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 }, /* [1][*] */ { 0, 1,3,1,3,1,3,3,1,3,1,3,1,3,1,1,3,1,3,1,3, 1,3,3,1,1,1,3,1,3,1,3,3,1,3,1,1,1,3,1,3,1,1,1,3,3,1,3,3,1,1, 3,3,1,3,3,3,1,3,1,3,1,1,3,3,1,1,1,1,3,1,1,3,1,1,1,3,3,1,3,3, 1,3,3,3,1,3,3,3,1,3,3,1,3,3,3,1,3,1,3,1,1,3,3,1,3,3,1,1,1,3, 3,1,3,3,1,3,1,1,3,3,3,1,1,1,3,1,1,3,1,1,3,3,1,3,1,3,3,3,3,1, 1,1,3,3,1,1,3,1,1,1,1,1,1,3,1,3,1,1,1,3,1,3,1,3,3,3,1,1,3,3, 1,3,1,3,1,1,3,1,3,1,3,1,3,1,1,1,3,3,1,3,3,1,3,1,1,1,3,1,3,1, 1,3,1,1,3,3,1,1,3,3,3,1,3,3,3,1,3,1,3,1,1,1,3,1,1,1,3,1,1,1, 1,1,3,3,3,1,1,1,1,3,3,3,1,3,3,1,1,1,1,3,1,1,3,1,3,3,1,1,3,3, 1,1,1,1,3,1,3,3,1,3,3,1,1,1,3,3,3,1,3,3,1,3,3,1,3,1,3,3,3,1, 3,1,1,3,1,3,1,1,1,3,3,3,1,1,3,1,3,1,1,1,1,1,1,3,1,1,3,1,3,3, 1,1,1,1,3,1,3,1,3,1,1,1,1,3,3,1,1,1,1,1,3,3,3,1,1,3,3,3,3,3, 1,3,3,1,3,3,3,3,1,1,1,1,1,1,3,1,1,3,1,1,1,3,1,1,1,3,3,3,1,3, 1,1,3,3,3,1,3,3,1,3,1,3,3,1,3,3,3,1,1, 3,3,1,3,1,3,1,1,1,3,3,3,3,1,3,1,1,3,1, 3,1,1,1,3,1,3,1,3,1,3,3,3,3,3,3,3,3,1,3,3,3,3,3,1,3,1,3,3,3, 1,3,1,3,1,3,3,1,3,3,3,3,3,3,3,3,3,1,1,1,1,1,1,3,3,1,1,3,3,1, 1,1,3,3,1,1,3,3,3,3,1,1,3,1,3,3,1,3,3,1,1,1,3,3,3,1,1,3,3,3, 3,3,1,1,1,3,1,3,3,1,3,3,3,3,1,1,3,1,1,3,1,3,1,3,1,3,3,1,1,3, 3,1,3,3,1,3,3,1,1,3,1,3,3,1,1,3,1,3,1,3,1,1,3,3,1,1,1,3,3,1, 3,1,1,3,3,1,1,3,1,3,1,1,1,1,1,3,1,1,1,1,3,1,3,1,1,3,3,1,1,3, 1,3,1,3,3,3,1,3,3,3,1,1,3,3,3,1,1,1,1,3,1,3,1,3,1,1,3,3,1,1, 1,3,3,1,3,1,3,1,1,1,1,1,1,3,1,3,3,1,3,3,3,1,3,1,1,3,3,1,1,3, 3,1,1,1,3,1,3,3,1,1,3,1,1,3,1,3,1,1,1,3,3,3,3,1,1,3,3,1,1,1, 1,3,1,1,3,3,3,1,1,3,3,1,3,3,1,1,3,3,3,3,3,3,3,1,3,3,1,3,1,3, 1,1,3,3,1,1,1,3,1,3,3,1,3,3,1,3,1,1,3,3,3,1,1,1,3,1,1,1,3,3, 3,1,3,3,1,3,1,1,3,3,3,1,3,3,1,1,1,3,1,3,3,3,3,3,3,3,3,1,3,3, 1,3,1,1,3,3,3,1,3,3,3,3,3,1,3,3,3,1,1,1, 3,3,1,3,3,1,3,1,3,1,3,1,3,3,3,3,3,3, 1,1,3,1,3,1,1,1,1,1,3,1,1,1,3,1,3,1,1,3,3,3,1,3,1,3,1,1,3,1, 3,3,1,3,1,3,3,1,3,3,1,3,3,3,3,3,3,1,3,1,1,3,3,3,1,1,3,3,3,3, 3,3,3,1,3,3,3,3,1,3,1,3,3,3,1,3,1,3,1,1,1,3,3,1,3,1,1,3,3,1, 3,1,1,1,1,3,1,3,1,1,3,1,3,1,3,3,3,3,3,3,1,3,3,3,3,1,3,3,1,3, 3,3,3,3,1,1,1,1,3,3,3,1,3,3,1,1,3,3,1,1,3,3,1,3,1,1,3,1,3,3, 3,3,3,1,3,1,1,3,3,3,3,1,3,1,1,3,3,3,3,3,3,1,1,3,1,3,1,1,3,1, 1,1,1,3,3,1,1,3,1,1,1,3,1,3,1,1,3,3,1,3,1,1,3,3,3,3,3,1,3,1, 1,1,3,1,1,1,3,1,1,3,1,3,3,3,3,3,1,1,1,3,3,3,3,1,3,3,3,3,1,1, 3,3,3,1,3,1,1,3,3,1,3,3,1,1,1,1,1,3,1,1,3,3,1,1,1,3,1,1,3,3, 1,3,3,3,3,3,3,3,3,1,1,3,3,1,1,3,1,3,3,3,3,3,1}, /* [2][*] */ { 0,0, 7,5,1,3,3,7,5,5,7,7,1,3,3,7,5,1,1,5,3,7, 1,7,5,1,3,7,7,1,1,1,5,7,7,5,1,3,3,7,5,5,5,3,3,3,1,1,5,1,1,5, 3,3,3,3,1,3,7,5,7,3,7,1,3,3,5,1,3,5,5,7,7,7,1,1,3,3,1,1,5,1, 5,7,5,1,7,5,3,3,1,5,7,1,7,5,1,7,3,1,7,1,7,3,3,5,7,3,3,5,1,3, 3,1,3,5,1,3,3,3,7,1,1,7,3,1,3,7,5,5,7,5,5,3,1,3,3,3,1,3,3,7, 3,3,1,7,5,1,7,7,5,7,5,1,3,1,7,3,7,3,5,7,3,1,3,3,3,1,5,7,3,3, 7,7,7,5,3,1,7,1,3,7,5,3,3,3,7,1,1,3,1,5,7,1,3,5,3,5,3,3,7,5, 5,3,3,1,3,7,7,7,1,5,7,1,3,1,1,7,1,3,1,7,1,5,3,5,3,1,1,5,5,3, 3,5,7,1,5,3,7,7,3,5,3,3,1,7,3,1,3,5,7,1,3,7,1,5,1,3,1,5,3,1, 7,1,5,5,5,3,7,1,1,7,3,1,1,7,5,7,5,7,7,3,7,1,3,7,7,3,5,1,1,7, 1,5,5,5,1,5,1,7,5,5,7,1,1,7,1,7,7,1,1,3,3,3,7,7,5,3,7,3,1,3, 7,5,3,3,5,7,1,1,5,5,7,7,1,1,1,1,5,5,5,7,5,7,1,1,3,5,1,3,3,7, 3,7,5,3,5,3,1,7,1,7,7,1,1,7,7,7,5,5,1,1,7,5,5,7,5,1,1,5,5,5, 5,5,5,1,3,1,5,7,3,3,5,7,3,7,1,7,7,1,3, 5,1,5,5,3,7,3,7,7,5,7,5,7,1,1,5,3,5,1, 5,3,7,1,5,7,7,3,5,1,3,5,1,5,3,3,3,7,3,5,1,3,7,7,3,7,5,3,3,1, 7,5,1,1,3,7,1,7,1,7,3,7,3,5,7,3,5,3,1,1,1,5,7,7,3,3,1,1,1,5, 5,7,3,1,1,3,3,7,3,3,5,1,3,7,3,3,7,3,5,7,5,7,7,3,3,5,1,3,5,3, 1,3,5,1,1,3,7,7,1,5,1,3,7,3,7,3,5,1,7,1,1,3,5,3,7,1,5,5,1,1, 3,1,3,3,7,1,7,3,1,7,3,1,7,3,5,3,5,7,3,3,3,5,1,7,7,1,3,1,3,7, 7,1,3,7,3,1,5,3,1,1,1,5,3,3,7,1,5,3,5,1,3,1,3,1,5,7,7,1,1,5, 3,1,5,1,1,7,7,3,5,5,1,7,1,5,1,1,3,1,5,7,5,7,7,1,5,1,1,3,5,1, 5,5,3,1,3,1,5,5,3,3,3,3,1,1,3,1,3,5,5,7,5,5,7,5,7,1,3,7,7,3, 5,5,7,5,5,3,3,3,1,7,1,5,5,5,3,3,5,1,3,1,3,3,3,7,1,7,7,3,7,1, 1,5,7,1,7,1,7,7,1,3,7,5,1,3,5,5,5,1,1,7,1,7,1,7,7,3,1,1,5,1, 5,1,5,3,5,5,5,5,5,3,3,7,3,3,5,5,3,7,1,5,7,5,1,5,5,3,5,5,7,5, 3,5,5,5,1,5,5,5,5,1,3,5,3,1,7,5,5,7,1,5,3,3,1,5,3,7,1,7,5,1, 1,3,1,1,7,1,5,5,3,7,3,7,5,3,1,1,3,1,3,5, 5,7,5,3,7,7,7,3,7,3,7,1,3,1,7,7,1,7, 3,7,3,7,3,7,3,5,1,1,7,3,1,5,5,7,1,5,5,5,7,1,5,5,1,5,5,3,1,3, 1,7,3,1,3,5,7,7,7,1,1,7,3,1,5,5,5,1,1,1,1,1,5,3,5,1,3,5,3,1, 1,1,1,3,7,3,7,5,7,1,5,5,7,5,3,3,7,5,3,1,1,3,1,3,1,1,3,7,1,7, 1,1,5,1,7,5,3,7,3,5,3,1,1,5,5,1,7,7,3,7,3,7,1,5,1,5,3,7,3,5, 7,7,7,3,3,1,1,5,5,3,7,1,1,1,3,5,3,1,1,3,3,7,5,1,1,3,7,1,5,7, 3,7,5,5,7,3,5,3,1,5,3,1,1,7,5,1,7,3,7,5,1,7,1,7,7,1,1,7,1,5, 5,1,1,7,5,7,1,5,3,5,3,3,7,1,5,1,1,5,5,3,3,7,5,5,1,1,1,3,1,5, 7,7,1,7,5,7,3,7,3,1,3,7,3,1,5,5,3,5,1,3,5,5,5,1,1,7,7,1,5,5, 1,3,5,1,5,3,5,3,3,7,5,7,3,7,3,1,3,7,7,3,3,1,1,3,3,3,3,3,5,5, 3,3,3,1,3,5,7,7,1,5,7,3,7,1,1,3,5,7,5,3,3,3}, /* [3][*] */ { 0,0,0,0, 1,7,9,13,11,1,3,7,9,5,13,13,11,3,15,5,3, 15,7,9,13,9,1,11,7,5,15,1,15,11,5,11,1,7,9,7,7,1,15,15,15,13, 3,3,15,5,9,7,13,3,7,5,11,9,1,9,1,5,7,13,9,9,1,7,3,5,1,11,11, 13,7,7,9,9,1,1,3,9,15,1,5,13,1,9,9,9,9,9,13,11,3,5,11,11,13, 5,3,15,1,11,11,7,13,15,11,13,9,11,15,15,13,3,15,7,9,11,13,11, 9,9,5,13,9,1,13,7,7,7,7,7,5,9,7,13,11,9,11,15,3,13,11,1,11,3, 3,9,11,1,7,1,15,15,3,1,9,1,7,13,11,3,13,11,7,3,3,5,13,11,5, 11,1,3,9,7,15,7,5,13,7,9,13,15,13,9,7,15,7,9,5,11,11,13,13,9, 3,5,13,9,11,15,11,7,1,7,13,3,13,3,13,9,15,7,13,13,3,13,15,15, 11,9,13,9,15,1,1,15,11,11,7,1,11,13,9,13,3,5,11,13,9,9,13,1, 11,15,13,3,13,7,15,1,15,3,3,11,7,13,7,7,9,7,5,15,9,5,5,7,15, 13,15,5,15,5,3,1,11,7,1,5,7,9,3,11,1,15,1,3,15,11,13,5,13,1, 7,1,15,7,5,1,1,15,13,11,11,13,5,11,7,9,7,1,5,3,9,5,5,11,5,1, 7,1,11,7,9,13,15,13,3,1,11,13,15,1,1,11,9,13,3,13,11,15,13,9, 9,9,5,5,5,5,1,15,5,9, 11,7,15,5,3,13,5,3,11,5,1,11,13,9,11, 3,7,13,15,1,7,11,1,13,1,15,1,9,7,3,9,11,1,9,13,13,3,11,7,9,1, 7,15,9,1,5,13,5,11,3,9,15,11,13,5,1,7,7,5,13,7,7,9,5,11,11,1, 1,15,3,13,9,13,9,9,11,5,5,13,15,3,9,15,3,11,11,15,15,3,11,15, 15,3,1,3,1,3,3,1,3,13,1,11,5,15,7,15,9,1,7,1,9,11,15,1,13,9, 13,11,7,3,7,3,13,7,9,7,7,3,3,9,9,7,5,11,13,13,7,7,15,9,5,5,3, 3,13,3,9,3,1,11,1,3,11,15,11,11,11,9,13,7,9,15,9,11,1,3,3,9, 7,15,13,13,7,15,9,13,9,15,13,15,9,13,1,11,7,11,3,13,5,1,7,15, 3,13,7,13,13,11,3,5,3,13,11,9,9,3,11,11,7,9,13,11,7,15,13,7, 5,3,1,5,15,15,3,11,1,7,3,15,11,5,5,3,5,5,1,15,5,1,5,3,7,5,11, 3,13,9,13,15,5,3,5,9,5,3,11,1,13,9,15,3,5,11,9,1,3,15,9,9,9, 11,7,5,13,1,15,3,13,9,13,5,1,5,1,13,13,7,7,1,9,5,11,9,11,13, 3,15,15,13,15,7,5,7,9,7,9,9,9,11,9,3,11,15,13,13,5,9,15,1,1, 9,5,13,3,13,15,3,1,3,11,13,1,15,9,9,3,1,9,1,9,1,13,11,15,7, 11,15,13,15,1,9,9,7, 3,5,11,7,3,9,5,15,7,5,3,13,7,1,1,9, 15,15,15,11,3,5,15,13,7,15,15,11,11,9,5,15,9,7,3,13,1,1,5,1, 3,1,7,1,1,5,1,11,11,9,9,5,13,7,7,7,1,1,9,9,11,11,15,7,5,5,3, 11,1,3,7,13,7,7,7,3,15,15,11,9,3,9,3,15,13,5,3,3,3,5,9,15,9, 9,1,5,9,9,15,5,15,7,9,1,9,9,5,11,5,15,15,11,7,7,7,1,1,11,11, 13,15,3,13,5,1,7,1,11,3,13,15,3,5,3,5,7,3,9,9,5,1,7,11,9,3,5, 11,13,13,13,9,15,5,7,1,15,11,9,15,15,13,13,13,1,11,9,15,9,5, 15,5,7,3,11,3,15,7,13,11,7,3,7,13,5,13,15,5,13,9,1,15,11,5,5, 1,11,3,3,7,1,9,7,15,9,9,3,11,15,7,1,3,1,1,1,9,1,5,15,15,7,5, 5,7,9,7,15,13,13,11,1,9,11,1,13,1,7,15,15,5,5,1,11,3,9,11,9, 9,9,1,9,3,5,15,1,1,9,7,3,3,1,9,9,11,9,9,13,13,3,13,11,13,5,1, 5,5,9,9,3,13,13,9,15,9,11,7,11,9,13,9,1,15,9,7,7,1,7,9,9,15, 1,11,1,13,13,15,9,13,7,15,3,9,3,1,13,7,5,9,3,1,7,1,1,13,3,3, 11,1,7,13,15,15,5,7,13,13,15,11,13,1,13,13,3,9,15,15,11,15,9, 15,1,13,15,1,1,5, 11,5,1,11,11,5,3,9,1,3,5,13,9,7,7,1, 9,9,15,7,5,5,15,13,9,7,13,3,13,11,13,7,9,13,13,13,15,9,5,5,3, 3,3,1,3,15}, /* [4][*] */ { 0,0,0,0,0,0, 9,3,27,15,29,21,23,19,11,25,7,13,17,1, 25,29,3,31,11,5,23,27,19,21,5,1,17,13,7,15,9,31,25,3,5,23,7, 3,17,23,3,3,21,25,25,23,11,19,3,11,31,7,9,5,17,23,17,17,25, 13,11,31,27,19,17,23,7,5,11,19,19,7,13,21,21,7,9,11,1,5,21, 11,13,25,9,7,7,27,15,25,15,21,17,19,19,21,5,11,3,5,29,31,29, 5,5,1,31,27,11,13,1,3,7,11,7,3,23,13,31,17,1,27,11,25,1,23, 29,17,25,7,25,27,17,13,17,23,5,17,5,13,11,21,5,11,5,9,31,19, 17,9,9,27,21,15,15,1,1,29,5,31,11,17,23,19,21,25,15,11,5,5,1, 19,19,19,7,13,21,17,17,25,23,19,23,15,13,5,19,25,9,7,3,21,17, 25,1,27,25,27,25,9,13,3,17,25,23,9,25,9,13,17,17,3,15,7,7,29, 3,19,29,29,19,29,13,15,25,27,1,3,9,9,13,31,29,31,5,15,29,1, 19,5,9,19,5,15,3,5,7,15,17,17,23,11,9,23,19,3,17,1,27,9,9,17, 13,25,29,23,29,11,31,25,21,29,19,27,31,3,5,3,3,13,21,9,29,3, 17,11,11,9,21,19,7,17,31,25,1,27,5,15,27,29,29,29,25,27,25,3, 21,17,25,13,15,17,13,23,9,3,11,7,9,9,7,17,7,1, 27,1,9,5,31,21,25,25,21,11,1,23,19,27, 15,3,5,23,9,25,7,29,11,9,13,5,11,1,3,31,27,3,17,27,11,13,15, 29,15,1,15,23,25,13,21,15,3,29,29,5,25,17,11,7,15,5,21,7,31, 13,11,23,5,7,23,27,21,29,15,7,27,27,19,7,15,27,27,19,19,9,15, 1,3,29,29,5,27,31,9,1,7,3,19,19,29,9,3,21,31,29,25,1,3,9,27, 5,27,25,21,11,29,31,27,21,29,17,9,17,13,11,25,15,21,11,19,31, 3,19,5,3,3,9,13,13,3,29,7,5,9,23,13,21,23,21,31,11,7,7,3,23, 1,23,5,9,17,21,1,17,29,7,5,17,13,25,17,9,19,9,5,7,21,19,13,9, 7,3,9,3,15,31,29,29,25,13,9,21,9,31,7,15,5,31,7,15,27,25,19, 9,9,25,25,23,1,9,7,11,15,19,15,27,17,11,11,31,13,25,25,9,7, 13,29,19,5,19,31,25,13,25,15,5,9,29,31,9,29,27,25,27,11,17,5, 17,3,23,15,9,9,17,17,31,11,19,25,13,23,15,25,21,31,19,3,11, 25,7,15,19,7,5,3,13,13,1,23,5,25,11,25,15,13,21,11,23,29,5, 17,27,9,19,15,5,29,23,19,1,27,3,23,21,19,27,11,17,13,27,11, 31,23,5,9,21,31,29,11,21,17,15,7,15,7,9,21,27,25, 29,11,3,21,13,23,19,27,17,29,25,17,9, 1,19,23,5,23,1,17,17,13,27,23,7,7,11,13,17,13,11,21,13,23,1, 27,13,9,7,1,27,29,5,13,25,21,3,31,15,13,3,19,13,1,27,15,17,1, 3,13,13,13,31,29,27,7,7,21,29,15,17,17,21,19,17,3,15,5,27,27, 3,31,31,7,21,3,13,11,17,27,25,1,9,7,29,27,21,23,13,25,29,15, 17,29,9,15,3,21,15,17,17,31,9,9,23,19,25,3,1,11,27,29,1,31, 29,25,29,1,23,29,25,13,3,31,25,5,5,11,3,21,9,23,7,11,23,11,1, 1,3,23,25,23,1,23,3,27,9,27,3,23,25,19,29,29,13,27,5,9,29,29, 13,17,3,23,19,7,13,3,19,23,5,29,29,13,13,5,19,5,17,9,11,11, 29,27,23,19,17,25,13,1,13,3,11,1,17,29,1,13,17,9,17,21,1,11, 1,1,25,5,7,29,29,19,19,1,29,13,3,1,31,15,13,3,1,11,19,5,29, 13,29,23,3,1,31,13,19,17,5,5,1,29,23,3,19,25,19,27,9,27,13, 15,29,23,13,25,25,17,19,17,15,27,3,25,17,27,3,27,31,23,13,31, 11,15,7,21,19,27,19,21,29,7,31,13,9,9,7,21,13,11,9,11,29,19, 11,19,21,5,29,13,7,19,19,27,23,31,1,27,21,7,3,7,11, 23,13,29,11,31,19,1,5,5,11,5,3,27,5, 7,11,31,1,27,31,31,23,5,21,27,9,25,3,15,19,1,19,9,5,25,21,15, 25,29,15,21,11,19,15,3,7,13,11,25,17,1,5,31,13,29,23,9,5,29, 7,17,27,7,17,31,9,31,9,9,7,21,3,3,3,9,11,21,11,31,9,25,5,1, 31,13,29,9,29,1,11,19,7,27,13,31,7,31,7,25,23,21,29,11,11,13, 11,27,1,23,31,21,23,21,19,31,5,31,25,25,19,17,11,25,7,13,1, 29,17,23,15,7,29,17,13,3,17}, /* [5][*] */ { 0,0,0,0,0,0,0,0,0,0,0,0, 37,33,7,5,11,39,63,59,17,15,23,29,3,21, 13,31,25,9,49,33,19,29,11,19,27,15,25,63,55,17,63,49,19,41, 59,3,57,33,49,53,57,57,39,21,7,53,9,55,15,59,19,49,31,3,39,5, 5,41,9,19,9,57,25,1,15,51,11,19,61,53,29,19,11,9,21,19,43,13, 13,41,25,31,9,11,19,5,53,37,7,51,45,7,7,61,23,45,7,59,41,1, 29,61,37,27,47,15,31,35,31,17,51,13,25,45,5,5,33,39,5,47,29, 35,47,63,45,37,47,59,21,59,33,51,9,27,13,25,43,3,17,21,59,61, 27,47,57,11,17,39,1,63,21,59,17,13,31,3,31,7,9,27,37,23,31,9, 45,43,31,63,21,39,51,27,7,53,11,1,59,39,23,49,23,7,55,59,3, 19,35,13,9,13,15,23,9,7,43,55,3,19,9,27,33,27,49,23,47,19,7, 11,55,27,35,5,5,55,35,37,9,33,29,47,25,11,47,53,61,59,3,53, 47,5,19,59,5,47,23,45,53,3,49,61,47,39,29,17,57,5,17,31,23, 41,39,5,27,7,29,29,33,31,41,31,29,17,29,29,9,9,31,27,53,35,5, 61,1,49,13,57,29,5,21,43,25,57,49,37,27,11,61,37,49,5,63,63, 3,45,37,63,21,21,19,27,59,21,45,23,13,15,3,43,63,39,19, 63,31,41,41,15,43,63,53,1,63,31,7,17, 11,61,31,51,37,29,59,25,63,59,47,15,27,19,29,45,35,55,39,19, 43,21,19,13,17,51,37,5,33,35,49,25,45,1,63,47,9,63,15,25,25, 15,41,13,3,19,51,49,37,25,49,13,53,47,23,35,29,33,21,35,23,3, 43,31,63,9,1,61,43,3,11,55,11,35,1,63,35,49,19,45,9,57,51,1, 47,41,9,11,37,19,55,23,55,55,13,7,47,37,11,43,17,3,25,19,55, 59,37,33,43,1,5,21,5,63,49,61,21,51,15,19,43,47,17,9,53,45, 11,51,25,11,25,47,47,1,43,29,17,31,15,59,27,63,11,41,51,29,7, 27,63,31,43,3,29,39,3,59,59,1,53,63,23,63,47,51,23,61,39,47, 21,39,15,3,9,57,61,39,37,21,51,1,23,43,27,25,11,13,21,43,7, 11,33,55,1,37,35,27,61,39,5,19,61,61,57,59,21,59,61,57,25,55, 27,31,41,33,63,19,57,35,13,63,35,17,11,11,49,41,55,5,45,17, 35,5,31,31,37,17,45,51,1,39,49,55,19,41,13,5,51,5,49,1,21,13, 17,59,51,11,3,61,1,33,37,33,61,25,27,59,7,49,13,63,3,33,3,15, 9,13,35,39,11,59,59,1,57,11,5,57,13,31,13,11,55,45,9,55,55, 19,25,41,23,45,29,63,59,27,39,21,37,7, 61,49,35,39,9,29,7,25,23,57,5,19,15,33,49,37,25,17,45,29,15, 25,3,3,49,11,39,15,19,57,39,15,11,3,57,31,55,61,19,5,41,35, 59,61,39,41,53,53,63,31,9,59,13,35,55,41,49,5,41,25,27,43,5, 5,43,5,5,17,5,15,27,29,17,9,3,55,31,1,45,45,13,57,17,3,61,15, 49,15,47,9,37,45,9,51,61,21,33,11,21,63,63,47,57,61,49,9,59, 19,29,21,23,55,23,43,41,57,9,39,27,41,35,61,29,57,63,21,31, 59,35,49,3,49,47,49,33,21,19,21,35,11,17,37,23,59,13,37,35, 55,57,1,29,45,11,1,15,9,33,19,53,43,39,23,7,13,13,1,19,41,55, 1,13,15,59,55,15,3,57,37,31,17,1,3,21,29,25,55,9,37,33,53,41, 51,19,57,13,63,43,19,7,13,37,33,19,15,63,51,11,49,23,57,47, 51,15,53,41,1,15,37,61,11,35,29,33,23,55,11,59,19,61,61,45, 13,49,13,63,5,61,5,31,17,61,63,13,27,57,1,21,5,11,39,57,51, 53,39,25,41,39,37,23,31,25,33,17,57,29,27,23,47,41,29,19,47, 41,25,5,51,43,39,29,7,31,45,51,49,55,17,43,49,45,9,29,3,5,47, 9,15,19, 51,45,57,63,9,21,59,3,9,13,45,23,15, 31,21,15,51,35,9,11,61,23,53,29,51,45,31,29,5,35,29,53,35,17, 59,55,27,51,59,27,47,15,29,37,7,49,55,5,19,45,29,19,57,33,53, 45,21,9,3,35,29,43,31,39,3,45,1,41,29,5,59,41,33,35,27,19,13, 25,27,43,33,35,17,17,23,7,35,15,61,61,53,5,15,23,11,13,43,55, 47,25,43,15,57,45,1,49,63,57,15,31,31,7,53,27,15,47,23,7,29, 53,47,9,53,3,25,55,45,63,21,17,23,31,27,27,43,63,55,63,45,51, 15,27,5,37,43,11,27,5,27,59,21,7,39,27,63,35,47,55,17,17,17, 3,19,21,13,49,61,39,15}, /* [6][*] */ { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 13,33,115,41,79,17,29,119,75,73,105,7, 59,65,21,3,113,61,89,45,107,21,71,79,19,71,61,41,57,121,87, 119,55,85,121,119,11,23,61,11,35,33,43,107,113,101,29,87,119, 97,29,17,89,5,127,89,119,117,103,105,41,83,25,41,55,69,117, 49,127,29,1,99,53,83,15,31,73,115,35,21,89,5,1,91,53,35,95, 83,19,85,55,51,101,33,41,55,45,95,61,27,37,89,75,57,61,15, 117,15,21,27,25,27,123,39,109,93,51,21,91,109,107,45,15,93, 127,3,53,81,79,107,79,87,35,109,73,35,83,107,1,51,7,59,33, 115,43,111,45,121,105,125,87,101,41,95,75,1,57,117,21,27,67, 29,53,117,63,1,77,89,115,49,127,15,79,81,29,65,103,33,73,79, 29,21,113,31,33,107,95,111,59,99,117,63,63,99,39,9,35,63,125, 99,45,93,33,93,9,105,75,51,115,11,37,17,41,21,43,73,19,93,7, 95,81,93,79,81,55,9,51,63,45,89,73,19,115,39,47,81,39,5,5,45, 53,65,49,17,105,13,107,5,5,19,73,59,43,83,97,115,27,1,69,103, 3,99,103,63,67,25,121,97,77,13,83,103,41,11,27,81,37,33,125, 71,41,41,59,41,87,123, 43,101,63,45,39,21,97,15,97,111,21,49, 13,17,79,91,65,105,75,1,45,67,83,107,125,87,15,81,95,105,65, 45,59,103,23,103,99,67,99,47,117,71,89,35,53,73,9,115,49,37, 1,35,9,45,81,19,127,17,17,105,89,49,101,7,37,33,11,95,95,17, 111,105,41,115,5,69,101,27,27,101,103,53,9,21,43,79,91,65, 117,87,125,55,45,63,85,83,97,45,83,87,113,93,95,5,17,77,77, 127,123,45,81,85,121,119,27,85,41,49,15,107,21,51,119,11,87, 101,115,63,63,37,121,109,7,43,69,19,77,49,71,59,35,7,13,55, 101,127,103,85,109,29,61,67,21,111,67,23,57,75,71,101,123,41, 107,101,107,125,27,47,119,41,19,127,33,31,109,7,91,91,39,125, 105,47,125,123,91,9,103,45,23,117,9,125,73,11,37,61,79,21,5, 47,117,67,53,85,33,81,121,47,61,51,127,29,65,45,41,95,57,73, 33,117,61,111,59,123,65,47,105,23,29,107,37,81,67,29,115,119, 75,73,99,103,7,57,45,61,95,49,101,101,35,47,119,39,67,31,103, 7,61,127,87,3,35,29,73,95,103,71,75,51,87,57,97,11,105,87,41, 73,109,69,35,121,39,111,1,77, 39,47,53,91,3,17,51,83,39,125,85,111, 21,69,85,29,55,11,117,1,47,17,65,63,47,117,17,115,51,25,33, 123,123,83,51,113,95,121,51,91,109,43,55,35,55,87,33,37,5,3, 45,21,105,127,35,17,35,37,97,97,21,77,123,17,89,53,105,75,25, 125,13,47,21,125,23,55,63,61,5,17,93,57,121,69,73,93,121,105, 75,91,67,95,75,9,69,97,99,93,11,53,19,73,5,33,79,107,65,69, 79,125,25,93,55,61,17,117,69,97,87,111,37,93,59,79,95,53,115, 53,85,85,65,59,23,75,21,67,27,99,79,27,3,95,27,69,19,75,47, 59,41,85,77,99,55,49,93,93,119,51,125,63,13,15,45,61,19,105, 115,17,83,7,7,11,61,37,63,89,95,119,113,67,123,91,33,37,99, 43,11,33,65,81,79,81,107,63,63,55,89,91,25,93,101,27,55,75, 121,79,43,125,73,27,109,35,21,71,113,89,59,95,41,45,113,119, 113,39,59,73,15,13,59,67,121,27,7,105,15,59,59,35,91,89,23, 125,97,53,41,91,111,29,31,3,103,61,71,35,7,119,29,45,49,111, 41,109,59,125,13,27,19,79,9,75,83,81,33,91,109,33,29,107,111, 101,107,109,65,59,43,37, 1,9,15,109,37,111,113,119,79,73,65, 71,93,17,101,87,97,43,23,75,109,41,49,53,31,97,105,109,119, 51,9,53,113,97,73,89,79,49,61,105,13,99,53,71,7,87,21,101,5, 71,31,123,121,121,73,79,115,13,39,101,19,37,51,83,97,55,81, 91,127,105,89,63,47,49,75,37,77,15,49,107,23,23,35,19,69,17, 59,63,73,29,125,61,65,95,101,81,57,69,83,37,11,37,95,1,73,27, 29,57,7,65,83,99,69,19,103,43,95,25,19,103,41,125,97,71,105, 83,83,61,39,9,45,117,63,31,5,117,67,125,41,117,43,77,97,15, 29,5,59,25,63,87,39,39,77,85,37,81,73,89,29,125,109,21,23, 119,105,43,93,97,15,125,29,51,69,37,45,31,75,109,119,53,5, 101,125,121,35,29,7,63,17,63,13,69,15,105,51,127,105,9,57,95, 59,109,35,49,23,33,107,55,33,57,79,73,69,59,107,55,11,63,95, 103,23,125,91,31,91,51,65,61,75,69,107,65,101,59,35,15}, /* [7][*] */ { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,7,23,39,217,141,27,53,181,169,35,15, 207,45,247,185,117,41,81,223,151,81,189,61,95,185,23,73,113, 239,85,9,201,83,53,183,203,91,149,101,13,111,239,3,205,253, 247,121,189,169,179,197,175,217,249,195,95,63,19,7,5,75,217, 245,111,189,165,169,141,221,249,159,253,207,249,219,23,49, 127,237,5,25,177,37,103,65,167,81,87,119,45,79,143,57,79,187, 143,183,75,97,211,149,175,37,135,189,225,241,63,33,43,13,73, 213,57,239,183,117,21,29,115,43,205,223,15,3,159,51,101,127, 99,239,171,113,171,119,189,245,201,27,185,229,105,153,189,33, 35,137,77,97,17,181,55,197,201,155,37,197,137,223,25,179,91, 23,235,53,253,49,181,249,53,173,97,247,67,115,103,159,239,69, 173,217,95,221,247,97,91,123,223,213,129,181,87,239,85,89, 249,141,39,57,249,71,101,159,33,137,189,71,253,205,171,13, 249,109,131,199,189,179,31,99,113,41,173,23,189,197,3,135,9, 95,195,27,183,1,123,73,53,99,197,59,27,101,55,193,31,61,119, 11,7,255,233,53,157,193,97,83,65,81,239,167,69,71,109, 97,137,71,193,189,115,79,205,37,227, 53,33,91,229,245,105,77,229,161,103,93,13,161,229,223,69,15, 25,23,233,93,25,217,247,61,75,27,9,223,213,55,197,145,89,199, 41,201,5,149,35,119,183,53,11,13,3,179,229,43,55,187,233,47, 133,91,47,71,93,105,145,45,255,221,115,175,19,129,5,209,197, 57,177,115,187,119,77,211,111,33,113,23,87,137,41,7,83,43, 121,145,5,219,27,11,111,207,55,97,63,229,53,33,149,23,187, 153,91,193,183,59,211,93,139,59,179,163,209,77,39,111,79,229, 85,237,199,137,147,25,73,121,129,83,87,93,205,167,53,107,229, 213,95,219,109,175,13,209,97,61,147,19,13,123,73,35,141,81, 19,171,255,111,107,233,113,133,89,9,231,95,69,33,1,253,219, 253,247,129,11,251,221,153,35,103,239,7,27,235,181,5,207,53, 149,155,225,165,137,155,201,97,245,203,47,39,35,105,239,49, 15,253,7,237,213,55,87,199,27,175,49,41,229,85,3,149,179,129, 185,249,197,15,97,197,139,203,63,33,251,217,199,199,99,249, 33,229,177,13,209,147,97,31,125,177,137, 187,11,91,223,29,169,231,59,31,163,41, 57,87,247,25,127,101,207,187,73,61,105,27,91,171,243,33,3,1, 21,229,93,71,61,37,183,65,211,53,11,151,165,47,5,129,79,101, 147,169,181,19,95,77,139,197,219,97,239,183,143,9,13,209,23, 215,53,137,203,19,151,171,133,219,231,3,15,253,225,33,111, 183,213,169,119,111,15,201,123,121,225,113,113,225,161,165,1, 139,55,3,93,217,193,97,29,69,231,161,93,69,143,137,9,87,183, 113,183,73,215,137,89,251,163,41,227,145,57,81,57,11,135,145, 161,175,159,25,55,167,157,211,97,247,249,23,129,159,71,197, 127,141,219,5,233,131,217,101,131,33,157,173,69,207,239,81, 205,11,41,169,65,193,77,201,173,1,221,157,1,15,113,147,137, 205,225,73,45,49,149,113,253,99,17,119,105,117,129,243,75, 203,53,29,247,35,247,171,31,199,213,29,251,7,251,187,91,11, 149,13,205,37,249,137,139,9,7,113,183,205,187,39,3,79,155, 227,89,185,51,127,63,83,41,133,183,181,127,19,255,219,59,251, 3,187,57,217,115,217,229,181,185,149,83,115,11, 123,19,109,165,103,123,219,129,155, 207,177,9,49,181,231,33,233,67,155,41,9,95,123,65,117,249,85, 169,129,241,173,251,225,147,165,69,81,239,95,23,83,227,249, 143,171,193,9,21,57,73,97,57,29,239,151,159,191,47,51,1,223, 251,251,151,41,119,127,131,33,209,123,53,241,25,31,183,107, 25,115,39,11,213,239,219,109,185,35,133,123,185,27,55,245,61, 75,205,213,169,163,63,55,49,83,195,51,31,41,15,203,41,63,127, 161,5,143,7,199,251,95,75,101,15,43,237,197,117,167,155,21, 83,205,255,49,101,213,237,135,135,21,73,93,115,7,85,223,237, 79,89,5,57,239,67,65,201,155,71,85,195,89,181,119,135,147, 237,173,41,155,67,113,111,21,183,23,103,207,253,69,219,205, 195,43,197,229,139,177,129,69,97,201,163,189,11,99,91,253, 239,91,145,19,179,231,121,7,225,237,125,191,119,59,175,237, 131,79,43,45,205,199,251,153,207,37,179,113,255,107,217,61,7, 181,247,31,13,113,145,107,233,233,43,79,23,169,137,129,183, 53,91,55,103,223,87,177,157,79,213,139, 183,231,205,143,129,243,205,93,59, 15,89,9,11,47,133,227,75,9,91,19,171,163,79,7,103,5,119,155, 75,11,71,95,17,13,243,207,187}, /* [8][*] */ { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 235,307,495,417,57,151,19,119,375,451, 55,449,501,53,185,317,17,21,487,13,347,393,15,391,307,189, 381,71,163,99,467,167,433,337,257,179,47,385,23,117,369,425, 207,433,301,147,333,85,221,423,49,3,43,229,227,201,383,281, 229,207,21,343,251,397,173,507,421,443,399,53,345,77,385,317, 155,187,269,501,19,169,235,415,61,247,183,5,257,401,451,95, 455,49,489,75,459,377,87,463,155,233,115,429,211,419,143,487, 195,209,461,193,157,193,363,181,271,445,381,231,135,327,403, 171,197,181,343,113,313,393,311,415,267,247,425,233,289,55, 39,247,327,141,5,189,183,27,337,341,327,87,429,357,265,251, 437,201,29,339,257,377,17,53,327,47,375,393,369,403,125,429, 257,157,217,85,267,117,337,447,219,501,41,41,193,509,131,207, 505,421,149,111,177,167,223,291,91,29,305,151,177,337,183, 361,435,307,507,77,181,507,315,145,423,71,103,493,271,469, 339,237,437,483,31,219,61,131,391,233,219,69,57,459,225,421, 7,461,111,451,277,185,193,125,251,199,73,71,7,409,417,149, 193,53,437,29,467,229,31,35,75,105, 503,75,317,401,367,131,365,441,433,93,377,405,465,259,283, 443,143,445,3,461,329,309,77,323,155,347,45,381,315,463,207, 321,157,109,479,313,345,167,439,307,235,473,79,101,245,19, 381,251,35,25,107,187,115,113,321,115,445,61,77,293,405,13, 53,17,171,299,41,79,3,485,331,13,257,59,201,497,81,451,199, 171,81,253,365,75,451,149,483,81,453,469,485,305,163,401,15, 91,3,129,35,239,355,211,387,101,299,67,375,405,357,267,363, 79,83,437,457,39,97,473,289,179,57,23,49,79,71,341,287,95, 229,271,475,49,241,261,495,353,381,13,291,37,251,105,399,81, 89,265,507,205,145,331,129,119,503,249,1,289,463,163,443,63, 123,361,261,49,429,137,355,175,507,59,277,391,25,185,381,197, 39,5,429,119,247,177,329,465,421,271,467,151,45,429,137,471, 11,17,409,347,199,463,177,11,51,361,95,497,163,351,127,395, 511,327,353,49,105,151,321,331,329,509,107,109,303,467,287, 161,45,385,289,363,331,265,407,37,433,315,343,63,51,185,71, 27,267, 503,239,293,245,281,297,75,461,371, 129,189,189,339,287,111,111,379,93,27,185,347,337,247,507, 161,231,43,499,73,327,263,331,249,493,37,25,115,3,167,197, 127,357,497,103,125,191,165,55,101,95,79,351,341,43,125,135, 173,289,373,133,421,241,281,213,177,363,151,227,145,363,239, 431,81,397,241,67,291,255,405,421,399,75,399,105,329,41,425, 7,283,375,475,427,277,209,411,3,137,195,289,509,121,55,147, 275,251,19,129,285,415,487,491,193,219,403,23,97,65,285,75, 21,373,261,339,239,495,415,333,107,435,297,213,149,463,199, 323,45,19,301,121,499,187,229,63,425,99,281,35,125,349,87, 101,59,195,511,355,73,263,243,101,165,141,11,389,219,187,449, 447,393,477,305,221,51,355,209,499,479,265,377,145,411,173, 11,433,483,135,385,341,89,209,391,33,395,319,451,119,341,227, 375,61,331,493,411,293,47,203,375,167,395,155,5,237,361,489, 127,21,345,101,371,233,431,109,119,277,125,263,73,135,123,83, 123,405,69,75,287,401,23,283,393,41,379,431,11,475,505,19, 365,265,271, 499,489,443,165,91,83,291,319,199, 107,245,389,143,137,89,125,281,381,215,131,299,249,375,455, 43,73,281,217,297,229,431,357,81,357,171,451,481,13,387,491, 489,439,385,487,177,393,33,71,375,443,129,407,395,127,65,333, 309,119,197,435,497,373,71,379,509,387,159,265,477,463,449, 47,353,249,335,505,89,141,55,235,187,87,363,93,363,101,67, 215,321,331,305,261,411,491,479,65,307,469,415,131,315,487, 83,455,19,113,163,503,99,499,251,239,81,167,391,255,317,363, 359,395,419,307,251,267,171,461,183,465,165,163,293,477,223, 403,389,97,335,357,297,19,469,501,249,85,213,311,265,379,297, 283,393,449,463,289,159,289,499,407,129,137,221,43,89,403, 271,75,83,445,453,389,149,143,423,499,317,445,157,137,453, 163,87,23,391,119,427,323,173,89,259,377,511,249,31,363,229, 353,329,493,427,57,205,389,91,83,13,219,439,45,35,371,441,17, 267,501,53,25,333,17,201,475,257,417,345,381,377,55,403,77, 389,347,363,211,413,419,5,167,219,201,285,425,11,77,269,489, 281,403,79, 425,125,81,331,437,271,397,299,475, 271,249,413,233,261,495,171,69,27,409,21,421,367,81,483,255, 15,219,365,497,181,75,431,99,325,407,229,281,63,83,493,5,113, 15,271,37,87,451,299,83,451,311,441,47,455,47,253,13,109,369, 347,11,409,275,63,441,15}, /* [9][*] */ { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,519,307,931,1023,517,771,151,1023, 539,725,45,927,707,29,125,371,275,279,817,389,453,989,1015, 29,169,743,99,923,981,181,693,309,227,111,219,897,377,425, 609,227,19,221,143,581,147,919,127,725,793,289,411,835,921, 957,443,349,813,5,105,457,393,539,101,197,697,27,343,515,69, 485,383,855,693,133,87,743,747,475,87,469,763,721,345,479, 965,527,121,271,353,467,177,245,627,113,357,7,691,725,355, 889,635,737,429,545,925,357,873,187,351,677,999,921,477,233, 765,495,81,953,479,89,173,473,131,961,411,291,967,65,511,13, 805,945,369,827,295,163,835,259,207,331,29,315,999,133,967, 41,117,677,471,717,881,755,351,723,259,879,455,721,289,149, 199,805,987,851,423,597,129,11,733,549,153,285,451,559,377, 109,357,143,693,615,677,701,475,767,85,229,509,547,151,389, 711,785,657,319,509,99,1007,775,359,697,677,85,497,105,615, 891,71,449,835,609,377,693,665,627,215,911,503,729,131,19, 895,199,161,239,633,1013,537,255,23,149,679,1021,595,199,557, 659,251,829,727,439,495,647,223, 949,625,87,481,85,799,917,769,949, 739,115,499,945,547,225,1015,469,737,495,353,103,17,665,639, 525,75,447,185,43,729,577,863,735,317,99,17,477,893,537,519, 1017,375,297,325,999,353,343,729,135,489,859,267,141,831,141, 893,249,807,53,613,131,547,977,131,999,175,31,341,739,467, 675,241,645,247,391,583,183,973,433,367,131,467,571,309,385, 977,111,917,935,473,345,411,313,97,149,959,841,839,669,431, 51,41,301,247,1015,377,329,945,269,67,979,581,643,823,557,91, 405,117,801,509,347,893,303,227,783,555,867,99,703,111,797, 873,541,919,513,343,319,517,135,871,917,285,663,301,15,763, 89,323,757,317,807,309,1013,345,499,279,711,915,411,281,193, 739,365,315,375,809,469,487,621,857,975,537,939,585,129,625, 447,129,1017,133,83,3,415,661,53,115,903,49,79,55,385,261, 345,297,199,385,617,25,515,275,849,401,471,377,661,535,505, 939,465,225,929,219,955,659,441,117,527,427,515,287,191,33, 389,197,825,63,417,949,35,571,9,131,609,439,95,19,569,893, 451,397,971,801, 125,471,187,257,67,949,621,453,411, 621,955,309,783,893,597,377,753,145,637,941,593,317,555,375, 575,175,403,571,555,109,377,931,499,649,653,329,279,271,647, 721,665,429,957,803,767,425,477,995,105,495,575,687,385,227, 923,563,723,481,717,111,633,113,369,955,253,321,409,909,367, 33,967,453,863,449,539,781,911,113,7,219,725,1015,971,1021, 525,785,873,191,893,297,507,215,21,153,645,913,755,371,881, 113,903,225,49,587,201,927,429,599,513,97,319,331,833,325, 887,139,927,399,163,307,803,169,1019,869,537,907,479,335,697, 479,353,769,787,1023,855,493,883,521,735,297,1011,991,879, 855,591,415,917,375,453,553,189,841,339,211,601,57,765,745, 621,209,875,639,7,595,971,263,1009,201,23,77,621,33,535,963, 661,523,263,917,103,623,231,47,301,549,337,675,189,357,1005, 789,189,319,721,1005,525,675,539,191,813,917,51,167,415,579, 755,605,721,837,529,31,327,799,961,279,409,847,649,241,285, 545,407,161,591,73,313,811,17,663,269,261,37,783,127,917,231, 577,975,793, 921,343,751,139,221,79,817,393,545, 11,781,71,1,699,767,917,9,107,341,587,903,965,599,507,843, 739,579,397,397,325,775,565,925,75,55,979,931,93,957,857,753, 965,795,67,5,87,909,97,995,271,875,671,613,33,351,69,811,669, 729,401,647,241,435,447,721,271,745,53,775,99,343,451,427, 593,339,845,243,345,17,573,421,517,971,499,435,769,75,203, 793,985,343,955,735,523,659,703,303,421,951,405,631,825,735, 433,841,485,49,749,107,669,211,497,143,99,57,277,969,107,397, 563,551,447,381,187,57,405,731,769,923,955,915,737,595,341, 253,823,197,321,315,181,885,497,159,571,981,899,785,947,217, 217,135,753,623,565,717,903,581,955,621,361,869,87,943,907, 853,353,335,197,771,433,743,195,91,1023,63,301,647,205,485, 927,1003,987,359,577,147,141,1017,701,273,89,589,487,859,343, 91,847,341,173,287,1003,289,639,983,685,697,35,701,645,911, 501,705,873,763,745,657,559,699,315,347,429,197,165,955,859, 167,303,833,531,473,635,641,195,589,821,205,3,635,371,891, 249,123, 77,623,993,401,525,427,71,655,951, 357,851,899,535,493,323,1003,343,515,859,1017,5,423,315,1011, 703,41,777,163,95,831,79,975,235,633,723,297,589,317,679,981, 195,399,1003,121,501,155}, /* [10][*] */ { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,7,2011,1001,49,825,415,1441,383,1581, 623,1621,1319,1387,619,839,217,75,1955,505,281,1629,1379,53, 1111,1399,301,209,49,155,1647,631,129,1569,335,67,1955,1611, 2021,1305,121,37,877,835,1457,669,1405,935,1735,665,551,789, 1543,1267,1027,1,1911,163,1929,67,1975,1681,1413,191,1711, 1307,401,725,1229,1403,1609,2035,917,921,1789,41,2003,187,67, 1635,717,1449,277,1903,1179,363,1211,1231,647,1261,1029,1485, 1309,1149,317,1335,171,243,271,1055,1601,1129,1653,205,1463, 1681,1621,197,951,573,1697,1265,1321,1805,1235,1853,1307,945, 1197,1411,833,273,1517,1747,1095,1345,869,57,1383,221,1713, 335,1751,1141,839,523,1861,1105,389,1177,1877,805,93,1591, 423,1835,99,1781,1515,1909,1011,303,385,1635,357,973,1781, 1707,1363,1053,649,1469,623,1429,1241,1151,1055,503,921,3, 349,1149,293,45,303,877,1565,1583,1001,663,1535,395,1141, 1481,1797,643,1507,465,2027,1695,367,937,719,545,1991,83,819, 239,1791,1461,1647,1501,1161,1629,139,1595,1921,1267,1415, 509,347,777,1083,363,269,1015, 1809,1105,1429,1471,2019,381,2025, 1223,827,1733,887,1321,803,1951,1297,1995,833,1107,1135,1181, 1251,983,1389,1565,273,137,71,735,1005,933,67,1471,551,457, 1667,1729,919,285,1629,1815,653,1919,1039,531,393,1411,359, 221,699,1485,471,1357,1715,595,1677,153,1903,1281,215,781, 543,293,1807,965,1695,443,1985,321,879,1227,1915,839,1945, 1993,1165,51,557,723,1491,817,1237,947,1215,1911,1225,1965, 1889,1503,1177,73,1767,303,177,1897,1401,321,921,217,1779, 327,1889,333,615,1665,1825,1639,237,1205,361,129,1655,983, 1089,1171,401,677,643,749,303,1407,1873,1579,1491,1393,1247, 789,763,49,5,1607,1891,735,1557,1909,1765,1777,1127,813,695, 97,731,1503,1751,333,769,865,693,377,1919,957,1359,1627,1039, 1783,1065,1665,1917,1947,991,1997,841,459,221,327,1595,1881, 1269,1007,129,1413,475,1105,791,1983,1359,503,691,659,691, 343,1375,1919,263,1373,603,1383,297,781,145,285,767,1739, 1715,715,317,1333,85,831,1615,81,1667,1467,1457,1453,1825, 109,387,1207,2039,213,1351,1329,1173, 57,1769,951,183,23,451,1155,1551, 2037,811,635,1671,1451,863,1499,1673,363,1029,1077,1525,277, 1023,655,665,1869,1255,965,277,1601,329,1603,1901,395,65, 1307,2029,21,1321,543,1569,1185,1905,1701,413,2041,1697,725, 1417,1847,411,211,915,1891,17,1877,1699,687,1089,1973,1809, 851,1495,1257,63,1323,1307,609,881,1543,177,617,1505,1747, 1537,925,183,77,1723,1877,1703,397,459,521,257,1177,389,1947, 1553,1583,1831,261,485,289,1281,1543,1591,1123,573,821,1065, 1933,1373,2005,905,207,173,1573,1597,573,1883,1795,1499,1743, 553,335,333,1645,791,871,1157,969,557,141,223,1129,1685,423, 1069,391,99,95,1847,531,1859,1833,1833,341,237,1997,1799,409, 431,1917,363,335,1039,1085,1657,1975,1527,1111,659,389,899, 595,1439,1861,1979,1569,1087,1009,165,1895,1481,1583,29,1193, 1673,1075,301,1081,1377,1747,1497,1103,1789,887,739,1577,313, 1367,1299,1801,1131,1837,73,1865,1065,843,635,55,1655,913, 1037,223,1871,1161,461,479,511,1721,1107,389,151,35,375,1099, 937,1185,1701,769,639,1633, 1609,379,1613,2031,685,289,975,671, 1599,1447,871,647,99,139,1427,959,89,117,841,891,1959,223, 1697,1145,499,1435,1809,1413,1445,1675,171,1073,1349,1545, 2039,1027,1563,859,215,1673,1919,1633,779,411,1845,1477,1489, 447,1545,351,1989,495,183,1639,1385,1805,1097,1249,1431,1571, 591,697,1509,709,31,1563,165,513,1425,1299,1081,145,1841, 1211,941,609,845,1169,1865,1593,347,293,1277,157,211,93,1679, 1799,527,41,473,563,187,1525,575,1579,857,703,1211,647,709, 981,285,697,163,981,153,1515,47,1553,599,225,1147,381,135, 821,1965,609,1033,983,503,1117,327,453,2005,1257,343,1649, 1199,599,1877,569,695,1587,1475,187,973,233,511,51,1083,665, 1321,531,1875,1939,859,1507,1979,1203,1965,737,921,1565,1943, 819,223,365,167,1705,413,1577,745,1573,655,1633,1003,91,1123, 477,1741,1663,35,715,37,1513,815,941,1379,263,1831,1735,1111, 1449,353,1941,1655,1349,877,285,1723,125,1753,985,723,175, 439,791,1051,1261,717,1555,1757,1777,577,1583,1957,873,331, 1163,313,1,1963,963,1905,821, 1677,185,709,545,1723,215,1885, 1249,583,1803,839,885,485,413,1767,425,129,1035,329,1263, 1881,1779,1565,359,367,453,707,1419,831,1889,887,1871,1869, 747,223,1547,1799,433,1441,553,2021,1303,1505,1735,1619,1065, 1161,2047,347,867,881,1447,329,781,1065,219,589,645,1257, 1833,749,1841,1733,1179,1191,1025,1639,1955,1423,1685,1711, 493,549,783,1653,397,895,233,759,1505,677,1449,1573,1297, 1821,1691,791,289,1187,867,1535,575,183}, /* [11][*] */ { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,3915,97,3047,937,2897,953,127,1201, 3819,193,2053,3061,3759,1553,2007,2493,603,3343,3751,1059, 783,1789,1589,283,1093,3919,2747,277,2605,2169,2905,721,4069, 233,261,1137,3993,3619,2881,1275,3865,1299,3757,1193,733,993, 1153,2945,3163,3179,437,271,3493,3971,1005,2615,2253,1131, 585,2775,2171,2383,2937,2447,1745,663,1515,3767,2709,1767, 3185,3017,2815,1829,87,3341,793,2627,2169,1875,3745,367,3783, 783,827,3253,2639,2955,3539,1579,2109,379,2939,3019,1999, 2253,2911,3733,481,1767,1055,4019,4085,105,1829,2097,2379, 1567,2713,737,3423,3941,2659,3961,1755,3613,1937,1559,2287, 2743,67,2859,325,2601,1149,3259,2403,3947,2011,175,3389,3915, 1315,2447,141,359,3609,3933,729,2051,1755,2149,2107,1741, 1051,3681,471,1055,845,257,1559,1061,2803,2219,1315,1369, 3211,4027,105,11,1077,2857,337,3553,3503,3917,2665,3823,3403, 3711,2085,1103,1641,701,4095,2883,1435,653,2363,1597,767,869, 1825,1117,1297,501,505,149,873,2673,551,1499,2793,3277,2143, 3663,533,3991,575,1877,1009,3929,473,3009,2595,3249,675,3593, 2453,1567,973,595,1335,1715,589,85, 2265,3069,461,1659,2627,1307,1731,1501,1699,3545,3803,2157, 453,2813,2047,2999,3841,2361,1079,573,69,1363,1597,3427,2899, 2771,1327,1117,1523,3521,2393,2537,1979,3179,683,2453,453, 1227,779,671,3483,2135,3139,3381,3945,57,1541,3405,3381,2371, 2879,1985,987,3017,3031,3839,1401,3749,2977,681,1175,1519, 3355,907,117,771,3741,3337,1743,1227,3335,2755,1909,3603, 2397,653,87,2025,2617,3257,287,3051,3809,897,2215,63,2043, 1757,3671,297,3131,1305,293,3865,3173,3397,2269,3673,717, 3041,3341,3595,3819,2871,3973,1129,513,871,1485,3977,2473, 1171,1143,3063,3547,2183,3993,133,2529,2699,233,2355,231, 3241,611,1309,3829,1839,1495,301,1169,1613,2673,243,3601, 3669,2813,2671,2679,3463,2477,1795,617,2317,1855,1057,1703, 1761,2515,801,1205,1311,473,3963,697,1221,251,381,3887,1761, 3093,3721,2079,4085,379,3601,3845,433,1781,29,1897,1599,2163, 75,3475,3957,1641,3911,2959,2833,1279,1099,403,799,2183,2699, 1711,2037,727,289,1785,1575,3633,2367,1261,3953,1735,171, 1959, 2867,859,2951,3211,15,1279,1323,599, 1651,3951,1011,315,3513,3351,1725,3793,2399,287,4017,3571, 1007,541,3115,429,1585,1285,755,1211,3047,915,3611,2697,2129, 3669,81,3939,2437,915,779,3567,3701,2479,3807,1893,3927,2619, 2543,3633,2007,3857,3837,487,1769,3759,3105,2727,3155,2479, 1341,1657,2767,2541,577,2105,799,17,2871,3637,953,65,69,2897, 3841,3559,4067,2335,3409,1087,425,2813,1705,1701,1237,821, 1375,3673,2693,3925,1541,1871,2285,847,4035,1101,2029,855, 2733,2503,121,2855,1069,3463,3505,1539,607,1349,575,2301, 2321,1101,333,291,2171,4085,2173,2541,1195,925,4039,1379,699, 1979,275,953,1755,1643,325,101,2263,3329,3673,3413,1977,2727, 2313,1419,887,609,2475,591,2613,2081,3805,3435,2409,111,3557, 3607,903,231,3059,473,2959,2925,3861,2043,3887,351,2865,369, 1377,2639,1261,3625,3279,2201,2949,3049,449,1297,897,1891, 411,2773,749,2753,1825,853,2775,3547,3923,3923,987,3723,2189, 3877,3577,297,2763,1845,3083,2951,483,2169,3985,245,3655, 3441,1023,235,835,3693,3585,327,1003,543,3059,2637, 2923,87,3617,1031,1043,903,2913, 2177,2641,3279,389,2009,525,4085,3299,987,2409,813,2683,373, 2695,3775,2375,1119,2791,223,325,587,1379,2877,2867,3793,655, 831,3425,1663,1681,2657,1865,3943,2977,1979,2271,3247,1267, 1747,811,159,429,2001,1195,3065,553,1499,3529,1081,2877,3077, 845,1793,2409,3995,2559,4081,1195,2955,1117,1409,785,287, 1521,1607,85,3055,3123,2533,2329,3477,799,3683,3715,337,3139, 3311,431,3511,2299,365,2941,3067,1331,1081,1097,2853,2299, 495,1745,749,3819,619,1059,3559,183,3743,723,949,3501,733, 2599,3983,3961,911,1899,985,2493,1795,653,157,433,2361,3093, 3119,3679,2367,1701,1445,1321,2397,1241,3305,3985,2349,4067, 3805,3073,2837,1567,3783,451,2441,1181,487,543,1201,3735, 2517,733,1535,2175,3613,3019}, /* [12][*] */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 2319,653,1379,1675,1951,7075,2087, 7147,1427,893,171,2019,7235,5697,3615,1961,7517,6849,2893, 1883,2863,2173,4543,73,381,3893,6045,1643,7669,1027,1549, 3983,1985,6589,7497,2745,2375,7047,1117,1171,1975,5199,3915, 3695,8113,4303,3773,7705,6855,1675,2245,2817,1719,569,1021, 2077,5945,1833,2631,4851,6371,833,7987,331,1899,8093,6719, 6903,5903,5657,5007,2689,6637,2675,1645,1819,689,6709,7717, 6295,7013,7695,3705,7069,2621,3631,6571,6259,7261,3397,7645, 1115,4753,2047,7579,2271,5403,4911,7629,4225,1209,6955,6951, 1829,5579,5231,1783,4285,7425,599,5785,3275,5643,2263,657, 6769,6261,1251,3249,4447,4111,3991,1215,131,4397,3487,7585, 5565,7199,3573,7105,7409,1671,949,3889,5971,3333,225,3647, 5403,3409,7459,6879,5789,6567,5581,4919,1927,4407,8085,4691, 611,3005,591,753,589,171,5729,5891,1033,3049,6567,5257,8003, 1757,4489,4923,6379,5171,1757,689,3081,1389,4113,455,2761, 847,7575,5829,633,6629,1103,7635,803,6175,6587,2711,3879,67, 1179,4761,7281,1557,3379,2459,4273,4127,7147,35, 3549,395,3735,5787,4179,5889,5057, 7473,4713,2133,2897,1841,2125,1029,1695,6523,1143,5105,7133, 3351,2775,3971,4503,7589,5155,4305,1641,4717,2427,5617,1267, 399,5831,4305,4241,3395,3045,4899,1713,171,411,7099,5473, 5209,1195,1077,1309,2953,7343,4887,3229,6759,6721,6775,675, 4039,2493,7511,3269,4199,6625,7943,2013,4145,667,513,2303, 4591,7941,2741,987,8061,3161,5951,1431,831,5559,7405,1357, 4319,4235,5421,2559,4415,2439,823,1725,6219,4903,6699,5451, 349,7703,2927,7809,6179,1417,5987,3017,4983,3479,4525,4643, 4911,227,5475,2287,5581,6817,1937,1421,4415,7977,1789,3907, 6815,6789,6003,5609,4507,337,7427,7943,3075,6427,1019,7121, 4763,81,3587,2929,1795,8067,2415,1265,4025,5599,4771,3025, 2313,6129,7611,6881,5253,4413,7869,105,3173,1629,2537,1023, 4409,7209,4413,7107,7469,33,1955,2881,5167,6451,4211,179, 5573,7879,3387,7759,5455,7157,1891,5683,5689,6535,3109,6555, 6873,1249,4251,6437,49,2745,1201,7327,4179,6783,623,2779, 5963,2585,6927,5333,4033,285,7467,4443,4917,3, 4319,5517,3449,813,5499,2515,5771, 3357,2073,4395,4925,2643,7215,5817,1199,1597,1619,7535,4833, 609,4797,8171,6847,793,6757,8165,3371,2431,5235,4739,7703, 7223,6525,5891,5605,4433,3533,5267,5125,5037,225,6717,1121, 5741,2013,4327,4839,569,5227,7677,4315,2391,5551,859,3627, 6377,3903,4311,6527,7573,4905,7731,1909,1555,3279,1949,1887, 6675,5509,2033,5473,3539,5033,5935,6095,4761,1771,1271,1717, 4415,5083,6277,3147,7695,2461,4783,4539,5833,5583,651,1419, 2605,5511,3913,5795,2333,2329,4431,3725,6069,2699,7055,6879, 1017,3121,2547,4603,2385,6915,6103,5669,7833,2001,4287,6619, 955,2761,5711,6291,3415,3909,2841,5627,4939,7671,6059,6275, 6517,1931,4583,7301,1267,7509,1435,2169,6939,3515,2985,2787, 2123,1969,3307,353,4359,7059,5273,5873,6657,6765,6229,3179, 1583,6237,2155,371,273,7491,3309,6805,3015,6831,7819,713, 4747,3935,4109,1311,709,3089,7059,4247,2989,1509,4919,1841, 3045,3821,6929,4655,1333,6429,6649,2131,5265,1051,261,8057, 3379,2179,1993,5655,3063,6381, 3587,7417,1579,1541,2107,5085,2873, 6141,955,3537,2157,841,1999,1465,5171,5651,1535,7235,4349, 1263,1453,1005,6893,2919,1947,1635,3963,397,969,4569,655, 6737,2995,7235,7713,973,4821,2377,1673,1,6541} }; static int sobol_init(soboldata *sd, unsigned sdim) { unsigned i,j; if (!sdim || sdim > MAXDIM) return 0; sd->mdata = (uint32_t *) malloc(sizeof(uint32_t) * (sdim * 32)); if (!sd->mdata) return 0; for (j = 0; j < 32; ++j) { sd->m[j] = sd->mdata + j * sdim; sd->m[j][0] = 1; /* special-case Sobol sequence */ } for (i = 1; i < sdim; ++i) { uint32_t a = sobol_a[i-1]; unsigned d = 0, k; while (a) { ++d; a >>= 1; } d--; /* d is now degree of poly */ /* set initial values of m from table */ for (j = 0; j < d; ++j) sd->m[j][i] = sobol_minit[j][i-1]; /* fill in remaining values using recurrence */ for (j = d; j < 32; ++j) { a = sobol_a[i-1]; sd->m[j][i] = sd->m[j - d][i]; for (k = 0; k < d; ++k) { sd->m[j][i] ^= ((a & 1) * sd->m[j-d+k][i]) << (d-k); a >>= 1; } } } sd->x = (uint32_t *) malloc(sizeof(uint32_t) * sdim); if (!sd->x) { free(sd->mdata); return 0; } sd->b = (unsigned *) malloc(sizeof(unsigned) * sdim); if (!sd->b) { free(sd->x); free(sd->mdata); return 0; } for (i = 0; i < sdim; ++i) { sd->x[i] = 0; sd->b[i] = 0; } sd->n = 0; sd->sdim = sdim; return 1; } static void sobol_destroy(soboldata *sd) { free(sd->mdata); free(sd->x); free(sd->b); } /************************************************************************/ /* NLopt API to Sobol sequence creation, which hides soboldata structure behind an opaque pointer */ nlopt_sobol nlopt_sobol_create(unsigned sdim) { nlopt_sobol s = (nlopt_sobol) malloc(sizeof(soboldata)); if (!s) return NULL; if (!sobol_init(s, sdim)) { free(s); return NULL; } return s; } extern void nlopt_sobol_destroy(nlopt_sobol s) { if (s) { sobol_destroy(s); free(s); } } /* if we know in advance how many points (n) we want to compute, then adopt the suggestion of the Joe and Kuo paper, which in turn is taken from Acworth et al (1998), of skipping a number of points equal to the largest power of 2 smaller than n */ void nlopt_sobol_skip(nlopt_sobol s, unsigned n, double *x) { if (s) { unsigned k = 1; while (k*2 < n) k *= 2; while (k-- > 0) nlopt_sobol_gen(s, x); } } stk/src/stk_sampling_vdc_rr2.c0000644000000000000000000003363413156161544013633 0ustar /***************************************************************************** * * * Small (Matlab/Octave) Toolbox for Kriging * * * * Copyright Notice * * * * Copyright (C) 2013 Alexandra Krauth, Elham Rahali & SUPELEC * * * * Authors: Julien Bect * * Alexandra Krauth * * Elham Rahali * * * * Copying Permission Statement * * * * This file is part of * * * * STK: a Small (Matlab/Octave) Toolbox for Kriging * * (http://sourceforge.net/projects/kriging) * * * * STK 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. * * * * STK 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 STK. If not, see . * * * ****************************************************************************/ #include #include #include #include "stk_mex.h" #include "primes.h" /***************************************************************************** * * * Subfunctions * * * ****************************************************************************/ int vanDerCorput_RR2(unsigned int b, unsigned int n, double *h); int compute_nb_digits(unsigned int n, unsigned int b); double radical_inverse(int *digits, unsigned int nb_digits, unsigned int b); int next_Mersenne_number(unsigned int b); int construct_permutRR(unsigned int b, int* permut); int construct_permutRR_Mersenne(unsigned int b, int* permut); /***************************************************************************** * * * MEX entry point (mexFunction) * * * * STK_SAMPLING_VDC_RR2 computes the first N terms of the J^th * * RR2-scrambled van der Corput sequence * * * * CALL: X = stk_sampling_vdc_rr2(N, J) * * * * Reference: Ladislav Kocis and William J. Whiten (1997) * * Computational investigations of lowdiscrepancy sequences. * * ACM Transactions on Mathematical Software, 23(2):266-294. * * * ****************************************************************************/ #define N_IN prhs[0] #define J_IN prhs[1] #define X_OUT plhs[0] void mexFunction (int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { int n_, j_, r; unsigned int n, j; double *h; mxArray* xdata; n_ = 0; j_ = 0; /*--- Read input arguments -----------------------------------------------*/ if(nrhs != 2) mexErrMsgIdAndTxt("STK:stk_sampling_vdc_rr2:nrhs", "Two inputs required."); if ((mxReadScalar_int(N_IN, &n_) != 0) || (n_ <= 0)) mexErrMsgIdAndTxt("STK:stk_sampling_vdc_rr2:IncorrectArgument", "First argument (n) must be a strictly positive " "scalar integer."); n = (unsigned int) n_; if ((mxReadScalar_int(J_IN, &j_) != 0) || (j_ <= 0)) mexErrMsgIdAndTxt("STK:stk_sampling_vdc_rr2:IncorrectArgument", "Second argument (j) must be a scrictly positive " "scalar integer."); j = (unsigned int) j_; if (j > PRIMES_TABLE_SIZE) mexErrMsgIdAndTxt("STK:stk_sampling_vdc_rr2:IncorrectArgument", "Second argument (d) must be smaller than %d.", PRIMES_TABLE_SIZE); /*--- Do the actual computations in a subroutine -------------------------*/ xdata = mxCreateDoubleMatrix(n, 1, mxREAL); h = mxGetPr(xdata); if ((r = vanDerCorput_RR2(primes_table[j - 1], n, h)) != STK_OK) mexErrMsgIdAndTxt("STK:stk_sampling_vdc_rr2:Sanity", "vanDerCorput_RR2() failed with error code %d.", r); /*--- Create output dataframe --------------------------------------------*/ if ((r = mexCallMATLAB(1, &X_OUT, 1, &xdata, "stk_dataframe")) != 0) mexErrMsgIdAndTxt("STK:stk_sampling_vdc_rr2:Sanity", "mexCallMATLAB() failed with error code %d.", r); } /***************************************************************************** * * * void vanDerCorput_RR2(unsigned int b, unsigned int N, double *result) * * * * Compute N terms of the RR2-scrambled van der Corput sequence in base b. * * * ****************************************************************************/ int vanDerCorput_RR2 (unsigned int b, unsigned int N, double *result) { int i, j, c, nb_digits_max, nb_digits, quotient; int *permut, *digits, *s_digits; /*--- Check input arguments ----------------------------------------------*/ if (N == 0) return STK_OK; /* we successfully did... nothing... */ if (b == 0) /* 0 is not a prime */ return STK_ERROR_DOMAIN; /*--- Allocate temporary arrays ------------------------------------------*/ /* Create arrays to store base-b representations (note: N is the biggest integer that we'll have to represent) */ if ((nb_digits_max = compute_nb_digits(N, b)) == -1) return STK_ERROR_SANITY; if ((digits = (int*) mxCalloc(nb_digits_max, sizeof(int))) == NULL) return STK_ERROR_OOM; if ((s_digits = (int*) mxCalloc(nb_digits_max, sizeof(int))) == NULL) return STK_ERROR_OOM; /* Create the permutation array */ if ((permut = (int*) mxCalloc(b, sizeof(int))) == NULL) return STK_ERROR_OOM; construct_permutRR(b, permut); /*--- Compute N terms in the base-b of the sequence ----------------------*/ nb_digits = 1; /* number of digits required to represent 1 in base b */ c = b; /* number of iterations before we increment nb_digits */ /* note: the first term is always zero, that's why we start at i = 1 */ for (i = 1; i < N; i++) { if ((--c) == 0) /* we need to increase the number of digits */ { nb_digits++; c = i * (b - 1); } /* Compute the representation of i in base b (no need to fill with zeros at the end) */ quotient = i; j = 0; while (quotient > 0) { digits[j] = quotient % b; quotient = quotient / b; j++; } /* Scramble the digits */ for(j = 0; j < nb_digits; j++) s_digits[j] = permut[digits[j]]; /* Compute the i^th term using the radical inverse function */ result[i] = radical_inverse(s_digits, nb_digits, b); } /*--- Free temporary arrays ----------------------------------------------*/ mxFree(digits); mxFree(s_digits); mxFree(permut); return STK_OK; } /***************************************************************************** * * * void construct_permutRR(unsigned int b, int* pi_b) * * * * Compute N terms of the RR2-scrambled van der Corput sequence in base b. * * * ****************************************************************************/ int construct_permutRR (unsigned int b, int* pi_b) { int i, j, b_max, *pi_b_max; /* Find the smallest number of the form 2^k - 1 (Mersenne number) that is greater than or equal to b. This number is not necessarily prime. */ b_max = next_Mersenne_number(b); /* Create an auxiliary permutation of {0, 1, ..., b_max - 1} */ if ((pi_b_max = mxCalloc(b_max, sizeof(int))) == NULL) return STK_ERROR_OOM; construct_permutRR_Mersenne(b_max, pi_b_max); /* Trim pi_b_max to get pi_b (note: the first element is always 0) */ j = 1; for (i = 1; i < b; i++) { while (pi_b_max[j] > (b - 1)) j++; pi_b[i] = pi_b_max[j++]; } mxFree(pi_b_max); return STK_OK; } /***************************************************************************** * * * int construct_permutRR_Mersenne(unsigned int b, int *permut) * * * * Construct the "reverse radix" permutation in the case where b is a * * Mersenne number. * * * * Note: careful, we do not actually check that b is a Mersenne number * * * ****************************************************************************/ int construct_permutRR_Mersenne (unsigned int b, int *permut) { int i, j, direct, reversed, digits; if ((digits = compute_nb_digits(b - 1, 2)) == -1) return STK_ERROR_SANITY; permut[0] = 0; for (i = 1; i < b; i++) { direct = i; reversed = 0; for(j = 0; j < digits; j++) { reversed <<= 1; reversed += (direct & 01); direct >>= 1; } permut[i] = reversed; } return STK_OK; } /***************************************************************************** * * * int compute_nb_digits(unsigned int n, unsigned int b) * * * * Compute the number of digits required to represent n in base b. * * * ****************************************************************************/ int compute_nb_digits (unsigned int n, unsigned int b) { int nb_digits, quotient; if ((b <= 0) || (n <= 0)) return -1; nb_digits = 0; quotient = n; while (quotient > 0) { nb_digits++; quotient = quotient / b; } return nb_digits; } /***************************************************************************** * * * double radical_inverse * * (int *digits, unsigned int nb_digits, unsigned int b) * * * * Apply the base-b radical inverse transform to a number given through its * * base-b representation * * * ****************************************************************************/ double radical_inverse (int *digits, unsigned int nb_digits, unsigned int b) { int i, b_pow_inv; double sum; b_pow_inv = 1; sum = 0; for (i = 0; i < nb_digits; i++) { b_pow_inv *= b; sum += ((double) digits[i]) / ((double)b_pow_inv); } return sum; } /***************************************************************************** * * * int next_Mersenne_number(unsigned int b) * * * * Compute the first integer bigger than b that is of the form * * * * 2^k - 1, with k an integer * * * ****************************************************************************/ int next_Mersenne_number (unsigned int b) { int m = 0; while (m < b) { m <<= 1; m += 1; } return m; } stk/src/wfg.c0000644000000000000000000011111413156161544010270 0ustar /***************************************************************************** * * * Small (Matlab/Octave) Toolbox for Kriging * * * * Copyright Notice * * * * Copyright (C) 2015-2017 CentraleSupelec * * * * Author: Julien Bect * * * * Based on the file wfg.c from WFG 1.10 by Lyndon While, Lucas * * Bradstreet, Luigi Barone, released under the GPLv2+ licence. The * * original copyright notice is: * * * * Copyright (C) 2010 Lyndon While, Lucas Bradstreet * * * * Copying Permission Statement * * * * This file is part of * * * * STK: a Small (Matlab/Octave) Toolbox for Kriging * * (http://sourceforge.net/projects/kriging) * * * * STK 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. * * * * STK 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 STK. If not, see . * * * ****************************************************************************/ /* TODO: find out which of these includes are *REALLY* necessary */ #include #include #include #include #include "mex.h" #include "wfg.h" double hv (FRONT*); /* and the RLIST-variant of hv: */ void Rlist_hv (FRONT* ps, RLIST* Rlist, int sign); #define BEATS(x,y) (x > y) #define WORSE(x,y) (BEATS(y,x) ? (x) : (y)) FRONT *fs = NULL; /* memory management stuff */ int fr = 0; /* current depth */ int safe = 0; /* the number of points that don't need sorting */ int greater (const void *v1, const void *v2) /* this sorts points worsening in the last objective */ { int i; POINT p = *(POINT*)v1; POINT q = *(POINT*)v2; int n = p.n; /* assume that p and q have the same size */ for (i = n - 1; i >= 0; i--) if BEATS(p.objectives[i],q.objectives[i]) return -1; else if BEATS(q.objectives[i],p.objectives[i]) return 1; return 0; } int greaterabbrev (const void *v1, const void *v2) /* this sorts points worsening in the penultimate objective */ { int i; POINT p = *(POINT*)v1; POINT q = *(POINT*)v2; int n = p.n; /* assume that p and q have the same size */ for (i = n - 2; i >= 0; i--) if BEATS(p.objectives[i],q.objectives[i]) return -1; else if BEATS(q.objectives[i],p.objectives[i]) return 1; return 0; } int dominates2way(POINT p, POINT q, int k) /* returns -1 if p dominates q, 1 if q dominates p, 2 if p == q, 0 otherwise k is the highest index inspected */ { int i, j; for (i = k; i >= 0; i--) if BEATS(p.objectives[i],q.objectives[i]) { for (j = i - 1; j >= 0; j--) if BEATS(q.objectives[j],p.objectives[j]) return 0; return -1; } else if BEATS(q.objectives[i],p.objectives[i]) { for (j = i - 1; j >= 0; j--) if BEATS(p.objectives[j],q.objectives[j]) return 0; return 1; } return 2; } int dominates1way(POINT p, POINT q, int k) /* returns true if p dominates q or p == q, false otherwise the assumption is that q doesn't dominate p k is the highest index inspected */ { int i; for (i = k; i >= 0; i--) if BEATS(q.objectives[i],p.objectives[i]) return 0; return 1; } void makeDominatedBit (FRONT* ps, int p) /* creates the front ps[0 .. p-1] in fs[fr], with each point bounded by ps[p] and dominated points removed */ { int i, j, k; int l = 0; int u = p - 1; int n = ps->n; POINT t; for (i = p - 1; i >= 0; i--) if (BEATS(ps->points[p].objectives[n - 1],ps->points[i].objectives[n - 1])) { fs[fr].points[u].objectives[n - 1] = ps->points[i].objectives[n - 1]; for (j = 0; j < n - 1; j++) fs[fr].points[u].objectives[j] = WORSE(ps->points[p].objectives[j],ps->points[i].objectives[j]); u--; } else { fs[fr].points[l].objectives[n - 1] = ps->points[p].objectives[n - 1]; for (j = 0; j < n - 1; j++) fs[fr].points[l].objectives[j] = WORSE(ps->points[p].objectives[j],ps->points[i].objectives[j]); l++; } /* points below l are all equal in the last objective; points above l are all worse points below l can dominate each other, and we don't need to compare the last objective points above l cannot dominate points that start below l, and we don't need to compare the last objective */ fs[fr].nPoints = 1; for (i = 1; i < l; i++) { j = 0; while (j < fs[fr].nPoints) switch (dominates2way(fs[fr].points[i], fs[fr].points[j], n-2)) { case 0: j++; break; case -1: /* AT THIS POINT WE KNOW THAT i CANNOT BE DOMINATED BY ANY OTHER PROMOTED POINT j SWAP i INTO j, AND 1-WAY DOM FOR THE REST OF THE js */ t = fs[fr].points[j]; fs[fr].points[j] = fs[fr].points[i]; fs[fr].points[i] = t; while(j < fs[fr].nPoints - 1 && dominates1way(fs[fr].points[j], fs[fr].points[fs[fr].nPoints - 1], n-1)) fs[fr].nPoints--; k = j+1; while (k < fs[fr].nPoints) if(dominates1way(fs[fr].points[j], fs[fr].points[k], n-2)) { t = fs[fr].points[k]; fs[fr].nPoints--; fs[fr].points[k] = fs[fr].points[fs[fr].nPoints]; fs[fr].points[fs[fr].nPoints] = t; } else k++; default: j = fs[fr].nPoints + 1; } if (j == fs[fr].nPoints) { t = fs[fr].points[fs[fr].nPoints]; fs[fr].points[fs[fr].nPoints] = fs[fr].points[i]; fs[fr].points[i] = t; fs[fr].nPoints++; } } safe = WORSE(l,fs[fr].nPoints); for (i = l; i < p; i++) { j = 0; while (j < safe) if(dominates1way(fs[fr].points[j], fs[fr].points[i], n-2)) j = fs[fr].nPoints + 1; else j++; while (j < fs[fr].nPoints) switch (dominates2way(fs[fr].points[i], fs[fr].points[j], n-1)) { case 0: j++; break; case -1: /* AT THIS POINT WE KNOW THAT i CANNOT BE DOMINATED BY ANY OTHER PROMOTED POINT j SWAP i INTO j, AND 1-WAY DOM FOR THE REST OF THE js */ t = fs[fr].points[j]; fs[fr].points[j] = fs[fr].points[i]; fs[fr].points[i] = t; while(j < fs[fr].nPoints - 1 && dominates1way(fs[fr].points[j], fs[fr].points[fs[fr].nPoints - 1], n-1)) fs[fr].nPoints--; k = j+1; while (k < fs[fr].nPoints) if(dominates1way(fs[fr].points[j], fs[fr].points[k], n-1)) { t = fs[fr].points[k]; fs[fr].nPoints--; fs[fr].points[k] = fs[fr].points[fs[fr].nPoints]; fs[fr].points[fs[fr].nPoints] = t; } else k++; default: j = fs[fr].nPoints + 1; } if (j == fs[fr].nPoints) { t = fs[fr].points[fs[fr].nPoints]; fs[fr].points[fs[fr].nPoints] = fs[fr].points[i]; fs[fr].points[i] = t; fs[fr].nPoints++; } } /* Set the number of objectives for all points */ wfg_front_resize (&fs[fr], fs[fr].nPoints, n); fr++; } double hv_2dim (FRONT* ps, int k) /* returns the hypervolume of ps[0 .. k-1] in 2D assumes that ps is sorted improving */ { int i; double volume = ps->points[0].objectives[0] * ps->points[0].objectives[1]; for (i = 1; i < k; i++) volume += ps->points[i].objectives[1] * (ps->points[i].objectives[0] - ps->points[i - 1].objectives[0]); return volume; } /* RLIST-variant of hv_2dim */ void Rlist_hv_2dim (FRONT* ps, int k, RLIST* Rlist, int sign) { int i, Ridx; double xmax0 = 0; Rlist_extend (Rlist, k, &Ridx); for (i = 0; i < k; i++, Ridx++) { Rlist->xmin[Ridx][0] = xmax0; xmax0 = ps->points[i].objectives[0]; Rlist->xmax[Ridx][0] = xmax0; Rlist->xmax[Ridx][1] = ps->points[i].objectives[1]; Rlist->sign[Ridx] = sign; } } double inclhv (POINT p) /* returns the inclusive hypervolume of p */ { int i; double volume = 1; for (i = 0; i < p.n; i++) volume *= p.objectives[i]; return volume; } /* RLIST-variant of inclhv */ void Rlist_inclhv (POINT p, RLIST* Rlist, int sign) { int Ridx; Rlist_extend (Rlist, 1, &Ridx); memcpy (Rlist->xmax[Ridx], p.objectives, p.n * sizeof (double)); Rlist->sign[Ridx] = sign; } double inclhv2 (POINT p, POINT q) /* returns the hypervolume of {p, q} */ { int i; int n = p.n; /* assume that p and q have the same size */ double vp = 1; double vq = 1; double vpq = 1; for (i = 0; i < n; i++) { vp *= p.objectives[i]; vq *= q.objectives[i]; vpq *= WORSE(p.objectives[i],q.objectives[i]); } return vp + vq - vpq; } /* RLIST-variant of inclhv2 */ void Rlist_inclhv2 (POINT p, POINT q, RLIST* Rlist, int sign) { int i, Ridx; int n = p.n; /* assume that p and q have the same size */ Rlist_extend (Rlist, 3, &Ridx); memcpy (Rlist->xmax[Ridx], p.objectives, n * sizeof (double)); Rlist->sign[Ridx++] = sign; memcpy (Rlist->xmax[Ridx], q.objectives, n * sizeof (double)); Rlist->sign[Ridx++] = sign; for (i = 0; i < n; i++) Rlist->xmax[Ridx][i] = WORSE(p.objectives[i], q.objectives[i]); Rlist->sign[Ridx] = -sign; } double inclhv3 (POINT p, POINT q, POINT r) /* returns the hypervolume of {p, q, r} */ { int i; int n = p.n; /* assume that p, q and r have the same size */ double vp = 1; double vq = 1; double vr = 1; double vpq = 1; double vpr = 1; double vqr = 1; double vpqr = 1; for (i = 0; i < n; i++) { vp *= p.objectives[i]; vq *= q.objectives[i]; vr *= r.objectives[i]; if (BEATS(p.objectives[i],q.objectives[i])) if (BEATS(q.objectives[i],r.objectives[i])) { vpq *= q.objectives[i]; vpr *= r.objectives[i]; vqr *= r.objectives[i]; vpqr *= r.objectives[i]; } else { vpq *= q.objectives[i]; vpr *= WORSE(p.objectives[i],r.objectives[i]); vqr *= q.objectives[i]; vpqr *= q.objectives[i]; } else if (BEATS(p.objectives[i],r.objectives[i])) { vpq *= p.objectives[i]; vpr *= r.objectives[i]; vqr *= r.objectives[i]; vpqr *= r.objectives[i]; } else { vpq *= p.objectives[i]; vpr *= p.objectives[i]; vqr *= WORSE(q.objectives[i],r.objectives[i]); vpqr *= p.objectives[i]; } } return vp + vq + vr - vpq - vpr - vqr + vpqr; } /* RLIST-variant of inclhv3 */ void Rlist_inclhv3 (POINT p, POINT q, POINT r, RLIST* Rlist, int sign) { int i, Ridx, Ridx_pq, Ridx_pr, Ridx_qr, Ridx_pqr; int n = p.n; /* assume that p, q and r have the same size */ Rlist_extend (Rlist, 7, &Ridx); memcpy (Rlist->xmax[Ridx], p.objectives, n * sizeof (double)); Rlist->sign[Ridx ++] = sign; memcpy (Rlist->xmax[Ridx], q.objectives, n * sizeof (double)); Rlist->sign[Ridx ++] = sign; memcpy (Rlist->xmax[Ridx], r.objectives, n * sizeof (double)); Rlist->sign[Ridx ++] = sign; Ridx_pq = Ridx ++; Rlist->sign[Ridx_pq] = -sign; Ridx_pr = Ridx ++; Rlist->sign[Ridx_pr] = -sign; Ridx_qr = Ridx ++; Rlist->sign[Ridx_qr] = -sign; Ridx_pqr = Ridx; Rlist->sign[Ridx_pqr] = sign; for (i = 0; i < n; i++) { if (BEATS(p.objectives[i], q.objectives[i])) if (BEATS(q.objectives[i], r.objectives[i])) { Rlist->xmax[Ridx_pq][i] = q.objectives[i]; Rlist->xmax[Ridx_pr][i] = r.objectives[i]; Rlist->xmax[Ridx_qr][i] = r.objectives[i]; Rlist->xmax[Ridx_pqr][i] = r.objectives[i]; } else { Rlist->xmax[Ridx_pq][i] = q.objectives[i]; Rlist->xmax[Ridx_pr][i] = WORSE(p.objectives[i], r.objectives[i]); Rlist->xmax[Ridx_qr][i] = q.objectives[i]; Rlist->xmax[Ridx_pqr][i] = q.objectives[i]; } else if (BEATS(p.objectives[i],r.objectives[i])) { Rlist->xmax[Ridx_pq][i] = p.objectives[i]; Rlist->xmax[Ridx_pr][i] = r.objectives[i]; Rlist->xmax[Ridx_qr][i] = r.objectives[i]; Rlist->xmax[Ridx_pqr][i] = r.objectives[i]; } else { Rlist->xmax[Ridx_pq][i] = p.objectives[i]; Rlist->xmax[Ridx_pr][i] = p.objectives[i]; Rlist->xmax[Ridx_qr][i] = WORSE(q.objectives[i], r.objectives[i]); Rlist->xmax[Ridx_pqr][i] = p.objectives[i]; } } } double inclhv4 (POINT p, POINT q, POINT r, POINT s) /* returns the hypervolume of {p, q, r, s} */ { int i; int n = p.n; /* assume that p, q, r and s have the same size */ double vp = 1; double vq = 1; double vr = 1; double vs = 1; double vpq = 1; double vpr = 1; double vps = 1; double vqr = 1; double vqs = 1; double vrs = 1; double vpqr = 1; double vpqs = 1; double vprs = 1; double vqrs = 1; double vpqrs = 1; OBJECTIVE z1, z2; for (i = 0; i < n; i++) { vp *= p.objectives[i]; vq *= q.objectives[i]; vr *= r.objectives[i]; vs *= s.objectives[i]; if (BEATS(p.objectives[i],q.objectives[i])) if (BEATS(q.objectives[i],r.objectives[i])) if (BEATS(r.objectives[i],s.objectives[i])) { vpq *= q.objectives[i]; vpr *= r.objectives[i]; vps *= s.objectives[i]; vqr *= r.objectives[i]; vqs *= s.objectives[i]; vrs *= s.objectives[i]; vpqr *= r.objectives[i]; vpqs *= s.objectives[i]; vprs *= s.objectives[i]; vqrs *= s.objectives[i]; vpqrs *= s.objectives[i]; } else { z1 = WORSE(q.objectives[i],s.objectives[i]); vpq *= q.objectives[i]; vpr *= r.objectives[i]; vps *= WORSE(p.objectives[i],s.objectives[i]); vqr *= r.objectives[i]; vqs *= z1; vrs *= r.objectives[i]; vpqr *= r.objectives[i]; vpqs *= z1; vprs *= r.objectives[i]; vqrs *= r.objectives[i]; vpqrs *= r.objectives[i]; } else if (BEATS(q.objectives[i],s.objectives[i])) { vpq *= q.objectives[i]; vpr *= WORSE(p.objectives[i],r.objectives[i]); vps *= s.objectives[i]; vqr *= q.objectives[i]; vqs *= s.objectives[i]; vrs *= s.objectives[i]; vpqr *= q.objectives[i]; vpqs *= s.objectives[i]; vprs *= s.objectives[i]; vqrs *= s.objectives[i]; vpqrs *= s.objectives[i]; } else { z1 = WORSE(p.objectives[i],r.objectives[i]); vpq *= q.objectives[i]; vpr *= z1; vps *= WORSE(p.objectives[i],s.objectives[i]); vqr *= q.objectives[i]; vqs *= q.objectives[i]; vrs *= WORSE(r.objectives[i],s.objectives[i]); vpqr *= q.objectives[i]; vpqs *= q.objectives[i]; vprs *= WORSE(z1,s.objectives[i]); vqrs *= q.objectives[i]; vpqrs *= q.objectives[i]; } else if (BEATS(q.objectives[i],r.objectives[i])) if (BEATS(p.objectives[i],s.objectives[i])) { z1 = WORSE(p.objectives[i],r.objectives[i]); z2 = WORSE(r.objectives[i],s.objectives[i]); vpq *= p.objectives[i]; vpr *= z1; vps *= s.objectives[i]; vqr *= r.objectives[i]; vqs *= s.objectives[i]; vrs *= z2; vpqr *= z1; vpqs *= s.objectives[i]; vprs *= z2; vqrs *= z2; vpqrs *= z2; } else { z1 = WORSE(p.objectives[i],r.objectives[i]); z2 = WORSE(r.objectives[i],s.objectives[i]); vpq *= p.objectives[i]; vpr *= z1; vps *= p.objectives[i]; vqr *= r.objectives[i]; vqs *= WORSE(q.objectives[i],s.objectives[i]); vrs *= z2; vpqr *= z1; vpqs *= p.objectives[i]; vprs *= z1; vqrs *= z2; vpqrs *= z1; } else if (BEATS(p.objectives[i],s.objectives[i])) { vpq *= p.objectives[i]; vpr *= p.objectives[i]; vps *= s.objectives[i]; vqr *= q.objectives[i]; vqs *= s.objectives[i]; vrs *= s.objectives[i]; vpqr *= p.objectives[i]; vpqs *= s.objectives[i]; vprs *= s.objectives[i]; vqrs *= s.objectives[i]; vpqrs *= s.objectives[i]; } else { z1 = WORSE(q.objectives[i],s.objectives[i]); vpq *= p.objectives[i]; vpr *= p.objectives[i]; vps *= p.objectives[i]; vqr *= q.objectives[i]; vqs *= z1; vrs *= WORSE(r.objectives[i],s.objectives[i]); vpqr *= p.objectives[i]; vpqs *= p.objectives[i]; vprs *= p.objectives[i]; vqrs *= z1; vpqrs *= p.objectives[i]; } } return vp + vq + vr + vs - vpq - vpr - vps - vqr - vqs - vrs + vpqr + vpqs + vprs + vqrs - vpqrs; } void Rlist_inclhv4 (POINT p, POINT q, POINT r, POINT s, RLIST* Rlist, int sign) /* returns the hypervolume of {p, q, r, s} */ { int i, Ridx; int Ridx_pq, Ridx_pr, Ridx_ps, Ridx_qr, Ridx_qs, Ridx_rs; int Ridx_pqr, Ridx_pqs, Ridx_prs, Ridx_qrs, Ridx_pqrs; int n = p.n; /* assume that p, q, r and s have the same size */ OBJECTIVE z1, z2; Rlist_extend (Rlist, 15, &Ridx); /* 15 = 2^4 - 1 */ memcpy (Rlist->xmax[Ridx], p.objectives, n * sizeof (double)); Rlist->sign[Ridx ++] = sign; memcpy (Rlist->xmax[Ridx], q.objectives, n * sizeof (double)); Rlist->sign[Ridx ++] = sign; memcpy (Rlist->xmax[Ridx], r.objectives, n * sizeof (double)); Rlist->sign[Ridx ++] = sign; memcpy (Rlist->xmax[Ridx], s.objectives, n * sizeof (double)); Rlist->sign[Ridx ++] = sign; Ridx_pq = Ridx ++; Rlist->sign[Ridx_pq] = -sign; Ridx_pr = Ridx ++; Rlist->sign[Ridx_pr] = -sign; Ridx_ps = Ridx ++; Rlist->sign[Ridx_ps] = -sign; Ridx_qr = Ridx ++; Rlist->sign[Ridx_qr] = -sign; Ridx_qs = Ridx ++; Rlist->sign[Ridx_qs] = -sign; Ridx_rs = Ridx ++; Rlist->sign[Ridx_rs] = -sign; Ridx_pqr = Ridx ++; Rlist->sign[Ridx_pqr] = sign; Ridx_pqs = Ridx ++; Rlist->sign[Ridx_pqs] = sign; Ridx_prs = Ridx ++; Rlist->sign[Ridx_prs] = sign; Ridx_qrs = Ridx ++; Rlist->sign[Ridx_qrs] = sign; Ridx_pqrs = Ridx; Rlist->sign[Ridx_pqrs] = -sign; for (i = 0; i < n; i++) { if (BEATS(p.objectives[i], q.objectives[i])) if (BEATS(q.objectives[i], r.objectives[i])) if (BEATS(r.objectives[i], s.objectives[i])) { Rlist->xmax[Ridx_pq][i] = q.objectives[i]; Rlist->xmax[Ridx_pr][i] = r.objectives[i]; Rlist->xmax[Ridx_ps][i] = s.objectives[i]; Rlist->xmax[Ridx_qr][i] = r.objectives[i]; Rlist->xmax[Ridx_qs][i] = s.objectives[i]; Rlist->xmax[Ridx_rs][i] = s.objectives[i]; Rlist->xmax[Ridx_pqr][i] = r.objectives[i]; Rlist->xmax[Ridx_pqs][i] = s.objectives[i]; Rlist->xmax[Ridx_prs][i] = s.objectives[i]; Rlist->xmax[Ridx_qrs][i] = s.objectives[i]; Rlist->xmax[Ridx_pqrs][i] = s.objectives[i]; } else { z1 = WORSE(q.objectives[i], s.objectives[i]); Rlist->xmax[Ridx_pq][i] = q.objectives[i]; Rlist->xmax[Ridx_pr][i] = r.objectives[i]; Rlist->xmax[Ridx_ps][i] = WORSE(p.objectives[i], s.objectives[i]); Rlist->xmax[Ridx_qr][i] = r.objectives[i]; Rlist->xmax[Ridx_qs][i] = z1; Rlist->xmax[Ridx_rs][i] = r.objectives[i]; Rlist->xmax[Ridx_pqr][i] = r.objectives[i]; Rlist->xmax[Ridx_pqs][i] = z1; Rlist->xmax[Ridx_prs][i] = r.objectives[i]; Rlist->xmax[Ridx_qrs][i] = r.objectives[i]; Rlist->xmax[Ridx_pqrs][i] = r.objectives[i]; } else if (BEATS(q.objectives[i], s.objectives[i])) { Rlist->xmax[Ridx_pq][i] = q.objectives[i]; Rlist->xmax[Ridx_pr][i] = WORSE(p.objectives[i], r.objectives[i]); Rlist->xmax[Ridx_ps][i] = s.objectives[i]; Rlist->xmax[Ridx_qr][i] = q.objectives[i]; Rlist->xmax[Ridx_qs][i] = s.objectives[i]; Rlist->xmax[Ridx_rs][i] = s.objectives[i]; Rlist->xmax[Ridx_pqr][i] = q.objectives[i]; Rlist->xmax[Ridx_pqs][i] = s.objectives[i]; Rlist->xmax[Ridx_prs][i] = s.objectives[i]; Rlist->xmax[Ridx_qrs][i] = s.objectives[i]; Rlist->xmax[Ridx_pqrs][i] = s.objectives[i]; } else { z1 = WORSE(p.objectives[i], r.objectives[i]); Rlist->xmax[Ridx_pq][i] = q.objectives[i]; Rlist->xmax[Ridx_pr][i] = z1; Rlist->xmax[Ridx_ps][i] = WORSE(p.objectives[i], s.objectives[i]); Rlist->xmax[Ridx_qr][i] = q.objectives[i]; Rlist->xmax[Ridx_qs][i] = q.objectives[i]; Rlist->xmax[Ridx_rs][i] = WORSE(r.objectives[i], s.objectives[i]); Rlist->xmax[Ridx_pqr][i] = q.objectives[i]; Rlist->xmax[Ridx_pqs][i] = q.objectives[i]; Rlist->xmax[Ridx_prs][i] = WORSE(z1, s.objectives[i]); Rlist->xmax[Ridx_qrs][i] = q.objectives[i]; Rlist->xmax[Ridx_pqrs][i] = q.objectives[i]; } else if (BEATS(q.objectives[i], r.objectives[i])) if (BEATS(p.objectives[i], s.objectives[i])) { z1 = WORSE(p.objectives[i], r.objectives[i]); z2 = WORSE(r.objectives[i], s.objectives[i]); Rlist->xmax[Ridx_pq][i] = p.objectives[i]; Rlist->xmax[Ridx_pr][i] = z1; Rlist->xmax[Ridx_ps][i] = s.objectives[i]; Rlist->xmax[Ridx_qr][i] = r.objectives[i]; Rlist->xmax[Ridx_qs][i] = s.objectives[i]; Rlist->xmax[Ridx_rs][i] = z2; Rlist->xmax[Ridx_pqr][i] = z1; Rlist->xmax[Ridx_pqs][i] = s.objectives[i]; Rlist->xmax[Ridx_prs][i] = z2; Rlist->xmax[Ridx_qrs][i] = z2; Rlist->xmax[Ridx_pqrs][i] = z2; } else { z1 = WORSE(p.objectives[i], r.objectives[i]); z2 = WORSE(r.objectives[i], s.objectives[i]); Rlist->xmax[Ridx_pq][i] = p.objectives[i]; Rlist->xmax[Ridx_pr][i] = z1; Rlist->xmax[Ridx_ps][i] = p.objectives[i]; Rlist->xmax[Ridx_qr][i] = r.objectives[i]; Rlist->xmax[Ridx_qs][i] = WORSE(q.objectives[i], s.objectives[i]); Rlist->xmax[Ridx_rs][i] = z2; Rlist->xmax[Ridx_pqr][i] = z1; Rlist->xmax[Ridx_pqs][i] = p.objectives[i]; Rlist->xmax[Ridx_prs][i] = z1; Rlist->xmax[Ridx_qrs][i] = z2; Rlist->xmax[Ridx_pqrs][i] = z1; } else if (BEATS(p.objectives[i], s.objectives[i])) { Rlist->xmax[Ridx_pq][i] = p.objectives[i]; Rlist->xmax[Ridx_pr][i] = p.objectives[i]; Rlist->xmax[Ridx_ps][i] = s.objectives[i]; Rlist->xmax[Ridx_qr][i] = q.objectives[i]; Rlist->xmax[Ridx_qs][i] = s.objectives[i]; Rlist->xmax[Ridx_rs][i] = s.objectives[i]; Rlist->xmax[Ridx_pqr][i] = p.objectives[i]; Rlist->xmax[Ridx_pqs][i] = s.objectives[i]; Rlist->xmax[Ridx_prs][i] = s.objectives[i]; Rlist->xmax[Ridx_qrs][i] = s.objectives[i]; Rlist->xmax[Ridx_pqrs][i] = s.objectives[i]; } else { z1 = WORSE(q.objectives[i], s.objectives[i]); Rlist->xmax[Ridx_pq][i] = p.objectives[i]; Rlist->xmax[Ridx_pr][i] = p.objectives[i]; Rlist->xmax[Ridx_ps][i] = p.objectives[i]; Rlist->xmax[Ridx_qr][i] = q.objectives[i]; Rlist->xmax[Ridx_qs][i] = z1; Rlist->xmax[Ridx_rs][i] = WORSE(r.objectives[i], s.objectives[i]); Rlist->xmax[Ridx_pqr][i] = p.objectives[i]; Rlist->xmax[Ridx_pqs][i] = p.objectives[i]; Rlist->xmax[Ridx_prs][i] = p.objectives[i]; Rlist->xmax[Ridx_qrs][i] = z1; Rlist->xmax[Ridx_pqrs][i] = p.objectives[i]; } } } double exclhv (FRONT* ps, int p) /* returns the exclusive hypervolume of ps[p] relative to ps[0 .. p-1] */ { double volume; makeDominatedBit (ps, p); volume = inclhv (ps->points[p]) - hv (&fs[fr - 1]); fr--; return volume; } /* RLIST-variant of exclhv */ void Rlist_exclhv (FRONT* ps, int p, RLIST* Rlist, int sign) { makeDominatedBit (ps, p); Rlist_inclhv (ps->points[p], Rlist, sign); Rlist_hv (&fs[fr - 1], Rlist, -sign); fr --; } double hv (FRONT* ps) /* returns the hypervolume of ps[0 ..] */ { int i; int n = ps->n; double volume; /* process small fronts with the IEA */ switch (ps->nPoints) { case 1: return inclhv (ps->points[0]); case 2: return inclhv2 (ps->points[0], ps->points[1]); case 3: return inclhv3 (ps->points[0], ps->points[1], ps->points[2]); case 4: return inclhv4 (ps->points[0], ps->points[1], ps->points[2], ps->points[3]); } /* these points need sorting */ qsort(&ps->points[safe], ps->nPoints - safe, sizeof(POINT), greater); /* n = 2 implies that safe = 0 */ if (n == 2) return hv_2dim (ps, ps->nPoints); /* these points don't NEED sorting, but it helps */ qsort(ps->points, safe, sizeof(POINT), greaterabbrev); if (n == 3 && safe > 0) { volume = ps->points[0].objectives[2] * (hv_2dim (ps, safe)); i = safe; } else { volume = inclhv4 (ps->points[0], ps->points[1], ps->points[2], ps->points[3]); i = 4; } wfg_front_resize (ps, ps->nPoints, n - 1); for (; i < ps->nPoints; i++) /* we can ditch dominated points here, but they will be ditched anyway in makeDominatedBit */ volume += ps->points[i].objectives[n - 1] * (exclhv (ps, i)); wfg_front_resize (ps, ps->nPoints, n); return volume; } /* RLIST-variant of hv */ void Rlist_hv (FRONT* ps, RLIST* Rlist, int sign) { int i, j, Ridx; int n = ps->n; /* process small fronts with the IEA */ switch (ps->nPoints) { case 1: Rlist_inclhv (ps->points[0], Rlist, sign); return; case 2: Rlist_inclhv2 (ps->points[0], ps->points[1], Rlist, sign); return; case 3: Rlist_inclhv3 (ps->points[0], ps->points[1], ps->points[2], Rlist, sign); return; case 4: Rlist_inclhv4 (ps->points[0], ps->points[1], ps->points[2], ps->points[3], Rlist, sign); return; } /* these points need sorting */ qsort (&ps->points[safe], ps->nPoints - safe, sizeof(POINT), greater); /* n = 2 implies that safe = 0 */ if (n == 2) { Rlist_hv_2dim (ps, ps->nPoints, Rlist, sign); return; } /* these points don't NEED sorting, but it helps */ qsort (ps->points, safe, sizeof(POINT), greaterabbrev); if ((n == 3) && (safe > 0)) { /* Take note of the number of rectangles before calling Rlist_hv_2dim */ Ridx = Rlist->size; Rlist_hv_2dim (ps, safe, Rlist, sign); /* Add last coordinate to all new rectangles */ for (j = Ridx; j < Rlist->size; j++) Rlist->xmax[j][2] = ps->points[0].objectives[2]; i = safe; } else { Rlist_inclhv4 (ps->points[0], ps->points[1], ps->points[2], ps->points[3], Rlist, sign); i = 4; } wfg_front_resize (ps, ps->nPoints, n - 1); for (; i < ps->nPoints; i++) { /* Take note of the number of rectangles before calling Rlist_exclhv */ Ridx = Rlist->size; Rlist_exclhv (ps, i, Rlist, sign); /* Add last coordinate to all new rectangles */ for (j = Ridx; j < Rlist->size; j++) Rlist->xmax[j][n - 1] = ps->points[i].objectives[n - 1]; } wfg_front_resize (ps, ps->nPoints, n); } /**************************/ /***** MAIN FUNCTIONS *****/ /**************************/ double wfg_compute_hv (FRONT* ps) { /* Set global variables */ safe = 0; fr = 0; return hv (ps); } void wfg_compute_decomposition (FRONT* ps, RLIST* Rlist) { /* Set global variables */ safe = 0; fr = 0; Rlist_hv (ps, Rlist, 1); } /********************************************/ /***** ALLOC/FREE GLOBAL LIST OF FRONTS *****/ /********************************************/ void wfg_alloc (int maxm, int maxn) /* Allocate memory for several auxiliary fronts */ { int i, max_depth; if (maxn > 2) { max_depth = maxn - 2; fs = (FRONT*) mxMalloc (sizeof (FRONT) * max_depth); for (i = 0; i < max_depth; i++) wfg_front_init (&fs[i], maxm, maxn - i - 1); } } void wfg_free (int maxm, int maxn) { int i, max_depth; if (maxn > 2) { max_depth = maxn - 2; for (i = 0; i < max_depth; i++) wfg_front_destroy (&fs[i]); mxFree (fs); } } /**************************************/ /***** BASIC OPERATIONS ON FRONTS *****/ /**************************************/ void wfg_front_init (FRONT* front, int nb_points, int nb_objectives) { int j; front->nPoints_alloc = nb_points; /* must *not* be changed */ front->n_alloc = nb_objectives; /* must *not* be changed */ front->nPoints = nb_points; front->n = nb_objectives; front->points = (POINT*) mxMalloc (sizeof (POINT) * nb_points); for (j = 0; j < nb_points; j++) { front->points[j].n = nb_objectives; front->points[j].objectives = (OBJECTIVE*) mxMalloc (sizeof (OBJECTIVE) * nb_objectives); } } void wfg_front_destroy (FRONT* front) { int j; for (j = 0; j < front->nPoints_alloc; j++) mxFree (front->points[j].objectives); mxFree (front->points); } void wfg_front_resize (FRONT* f, int nb_points, int nb_objectives) { int j; if (nb_points > f->nPoints_alloc) mexErrMsgTxt ("Cannot set nPoints > nPoints_alloc."); if (nb_objectives > f->n_alloc) mexErrMsgTxt ("Cannot set n > n_alloc."); f->nPoints = nb_points; f->n = nb_objectives; for (j = 0; j < nb_points; j++) f->points[j].n = nb_objectives; } /***************************************/ /***** BASIC OPERATIONS ON RLIST's *****/ /***************************************/ RLIST* Rlist_alloc (int alloc_size, int n) { int block_size = n * alloc_size; RLIST* Rlist = (RLIST*) mxMalloc (sizeof (RLIST)); Rlist->size = 0; Rlist->allocated_size = alloc_size; Rlist->n = n; Rlist->xmin = (double**) mxMalloc (alloc_size * sizeof (double*)); Rlist->xmax = (double**) mxMalloc (alloc_size * sizeof (double*)); Rlist->sign = (int*) mxMalloc (alloc_size * sizeof (int)); Rlist->xmin_data = (double*) mxMalloc (block_size * sizeof (double)); Rlist->xmax_data = (double*) mxMalloc (block_size * sizeof (double)); return Rlist; } void Rlist_extend (RLIST* Rlist, int k, int* p_Ridx) { int i, j; int n = Rlist->n; int old_size = Rlist->size; int new_size = old_size + k; int block_size; if (new_size > Rlist->allocated_size) { while (new_size > Rlist->allocated_size) Rlist->allocated_size *= 2; block_size = n * Rlist->allocated_size; Rlist->xmin = (double**) mxRealloc (Rlist->xmin, Rlist->allocated_size * sizeof (double*)); Rlist->xmax = (double**) mxRealloc (Rlist->xmax, Rlist->allocated_size * sizeof (double*)); Rlist->sign = (int*) mxRealloc (Rlist->sign, Rlist->allocated_size * sizeof (int)); Rlist->xmin_data = (double*) mxRealloc (Rlist->xmin_data, block_size * sizeof (double)); Rlist->xmax_data = (double*) mxRealloc (Rlist->xmax_data, block_size * sizeof (double)); /* We have to fill xmin and xmax entirely again (since xmin_data and xmax_data might have been moved during realloc */ for (i = 0, j = 0; i < new_size; i++, j += n) { Rlist->xmin[i] = &(Rlist->xmin_data[j]); Rlist->xmax[i] = &(Rlist->xmax_data[j]); } } else { /* No realloc: we just have to fill up from old_size */ for (i = old_size, j = n * old_size; i < new_size; i++, j += n) { Rlist->xmin[i] = &(Rlist->xmin_data[j]); Rlist->xmax[i] = &(Rlist->xmax_data[j]); } } Rlist->size = new_size; /* Set all components of xmin to 0 (the reference) */ for (j = n * old_size; j < n * new_size; j++) Rlist->xmin_data[j] = 0.0; *p_Ridx = old_size; } void Rlist_free (RLIST* Rlist) { mxFree (Rlist->xmin); mxFree (Rlist->xmin_data); mxFree (Rlist->xmax); mxFree (Rlist->xmax_data); mxFree (Rlist->sign); mxFree (Rlist); } stk/src/wfg.h0000644000000000000000000001100413156161544010272 0ustar /***************************************************************************** * * * Small (Matlab/Octave) Toolbox for Kriging * * * * Copyright Notice * * * * Copyright (C) 2015, 2016 CentraleSupelec * * * * Author: Julien Bect * * * * Based on the file wfg.h from WFG 1.10 by Lyndon While, Lucas * * Bradstreet, Luigi Barone, released under the GPLv2+ licence. The * * original copyright notice is: * * * * Copyright (C) 2010 Lyndon While, Lucas Bradstreet * * * * Copying Permission Statement * * * * This file is part of * * * * STK: a Small (Matlab/Octave) Toolbox for Kriging * * (http://sourceforge.net/projects/kriging) * * * * STK 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. * * * * STK 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 STK. If not, see . * * * ****************************************************************************/ #ifndef ___WFG_H___ #define ___WFG_H___ typedef double OBJECTIVE; typedef struct { int n; OBJECTIVE *objectives; } POINT; typedef struct { int nPoints; int nPoints_alloc; /* must *not* be changed */ int n; int n_alloc; /* must *not* be changed */ POINT *points; } FRONT; double wfg_compute_hv (FRONT* ps); void wfg_alloc (int maxm, int maxn); void wfg_free (int maxm, int maxn); void wfg_front_init (FRONT* front, int nb_points, int nb_objectives); void wfg_front_destroy (FRONT* front); void wfg_front_resize (FRONT* f, int nb_points, int nb_objectives); /*****************************************/ /* RLIST structure & associated funtions */ /*****************************************/ typedef struct { int allocated_size; /* maximal number of rectangles */ int size; /* current number of rectangles */ int n; /* dimension (number of objectives) */ double **xmin; /* lower bounds */ double *xmin_data; /* lower bounds (one block) */ double **xmax; /* upper bounds */ double *xmax_data; /* upper bounds (one block) */ int *sign; /* inclusion/exclusion */ } RLIST; /* wfg_compute_decomposition: similar to wfg_compute_hv, but */ /* returns a decomposition of the dominated region into */ /* hyper-rectangles (instead of its hyper-volume) */ void wfg_compute_decomposition (FRONT* ps, RLIST* Rlist); /* Memory management */ RLIST* Rlist_alloc (int alloc_size, int n); void Rlist_extend (RLIST* Rlist, int k, int* p_Ridx); void Rlist_free (RLIST* Rlist); #endif