Index: test-suite/trunk/LICENSE.TXT =================================================================== --- test-suite/trunk/LICENSE.TXT +++ test-suite/trunk/LICENSE.TXT @@ -84,6 +84,7 @@ llvm-test/MultiSource/Benchmarks/ASC_Sequoia/sphot smg2000: llvm-test/MultiSource/Benchmarks/ASCI_Purple/SMG2000 miniAMR: llvm-test/MultiSource/Benchmarks/DOE-ProxyApps-C/miniAMR +Pathfinder: llvm-test/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder XSBench: llvm-test/MultiSource/Benchmarks/DOE-ProxyApps-C/XSBench HPCCG: llvm-test/MultiSource/Benchmarks/DOE-ProxyApps-C++/HPCCG PENNANT: llvm-test/MultiSource/Benchmarks/DOE-ProxyApps-C++/PENNANT Index: test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/CMakeLists.txt =================================================================== --- test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/CMakeLists.txt +++ test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/CMakeLists.txt @@ -1,2 +1,3 @@ add_subdirectory(XSBench) +add_subdirectory(Pathfinder) add_subdirectory(miniAMR) Index: test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Makefile =================================================================== --- test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Makefile +++ test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Makefile @@ -2,7 +2,7 @@ LEVEL = ../../.. PARALLEL_DIRS = XSBench \ - miniAMR - + miniAMR \ + Pathfinder include $(LEVEL)/Makefile.programs Index: test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/CMakeLists.txt =================================================================== --- test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/CMakeLists.txt +++ test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/CMakeLists.txt @@ -0,0 +1,4 @@ +set(PROG PathFinder) +list(APPEND LDFLAGS -lm) +set(RUN_OPTIONS -x ${CMAKE_CURRENT_SOURCE_DIR}/medsmall1.adj_list) +llvm_multisource() Index: test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/COPYING =================================================================== --- test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/COPYING +++ test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/COPYING @@ -0,0 +1,674 @@ + 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 +. Index: test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/COPYING.LESSER =================================================================== --- test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/COPYING.LESSER +++ test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/COPYING.LESSER @@ -0,0 +1,165 @@ + GNU LESSER 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. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser 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 +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. Index: test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/Makefile =================================================================== --- test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/Makefile +++ test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/Makefile @@ -0,0 +1,6 @@ +LEVEL = ../../../.. + +PROG = PathFinder +LDFLAGS = -lm +RUN_OPTIONS = -x $(PROJ_SRC_DIR)/medsmall1.adj_list +include $(LEVEL)/MultiSource/Makefile.multisrc Index: test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/PathFinder.reference_output =================================================================== --- test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/PathFinder.reference_output +++ test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/PathFinder.reference_output @@ -0,0 +1,28 @@ + + + PathFinder: finding a series of labeled nodes within a + two-layer directed, cyclic graph. + Copyright (2013) Sandia Corporation + + Sandia National Laboratories is a multi-program laboratory managed and + operated by Sandia Corporation, a wholly owned subsidiary of Lockheed + Martin Corporation, for the U.S. Department of Energy's National Nuclear + Security Administration under terms of Contract DE-AC04-94AL85000, + there is a non-exclusive license for use of this work by or on behalf + of the U.S. Government. Export of this program may require a license + from the United States Government. + + + 500 functions specified + 3463 basic blocks specified + 371 total System Call Map elements + ...parsing complete. +Immediately before parallel + + +44669 found out of 137641 searches. Overall Time: 0:0:0.000 + + +Total 44669 legs found + +exit 0 Index: test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/README =================================================================== --- test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/README +++ test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/README @@ -0,0 +1,220 @@ +************************************************************************** +LLVM Test-suite Note: +************************************************************************** +The original source is located at https://github.com/Mantevo/PathFinder. +Beyond this paragraph is the original README contained with the source +code. The Makefile refered to within is not utilized within the +test-suite. The test-suite builds a serial version (openmp and +mpi disabled) with its own cmake and make build system. +************************************************************************** + +PathFinder graph pathway analysis mini-application + +------------------------------------ +Contents of this README file: +1. PathFinder overview +2. PathFinder versions +3. Building PathFinder +4. Running PathFinder +5. PathFinder search algorithm/pseudo code +------------------------------------ + +------------------------------------ +1. PathFinder overview: + +PathFinder searches for "signatures" within graphs. Graphs being searched are +directed and cyclic. Many, but not all nodes within the graph have labels. Any +given node may have more than one label, and any label may be applied to more +than one node. A signature is an orderd list of labels. PathFinder searches for +paths between labels within the signature. PathFinder returns success if there +is a path from a node with the first label in the signature that passes through +nodes with each label in order, ultimately reaching a node with the last label +in the signature. Labeled nodes need not be contiguous on any given path. + +At the current time, PathFinder does not do any pathway analysis (e.g. shortest +path) for discovered signatures. PathFinder simply searches until a signature is +satisfied or all pathways have been exhausted. + +------------------------------------ +2. PathFinder versions: + +- PathFinder_ref: + reference version: self-contained. Includes serial and OpenMP parallel + implementations. MPI is not yet supported. + +------------------------------------ +3. Building PathFinder: + +The standard build is to cd into the 'PathFinder_ref' directory and type 'make'. +Doing so builds an OpenMP enabled version of PathFinder (named PathFinder.x). For +serial execution, run it with the OMP_NUM_THREADS environment variable set to 1. + +Alternative build targets: + * clean -- removes all .o files + * realclean -- removes all .o and .x files + * debug -- PathFinder.x+dbg - serial executable with debug information + * mpi -- currently not implemented; prints an error message + +To verify execution, type 'make check' which builds a serial version, runs it +against one of the known data sets and compares the results. + +------------------------------------ +4. Running PathFinder: + +The simplest execution is to simply type './PathFinder.x'. This will run +PathFinder with a trivial graph (MicroTestData.adj_list in the source +directory). It will find 6 legs out of 9 searches, by doing an "exhaustive" +search on that graph. + +An exhaustive search is PathFinder determining if paths exist between any pair +of labels for every label existing in the graph. Exhaustive searches are +embarrassingly parallel, and can be quite time consuming depending on the size +of the graph and number of labels. Running PathFinder exhaustively is done with +the -x switch: + PathFinder.x -x + e.g. PathFinder.x -x ../scaleData/1kx750.adj_list + +To search for specific signatures, PathFinder can be run interactively or with +a configuration file. To run interactively, use the -i switch: + PathFinder.x -i +PathFinder will prompt the operator for a series of labels to define the +signature for which PathFinder will search. + +Multiple data files and multiple signatures can be specified to PathFinder in a +configuration file. A python script (config_builder.py) exists to assist the +operator in creating a configuration file. A sample configuration file is +included in the PathFinder source directory. To run PathFinder with a config +file, use the -c switch: + PathFinder.x -c + e.g. PathFinder.x -c sampleConfig + +Typing 'PathFinder -h' will print a help message describing the available +execution switches. Sample data files are provided in the 'data' and +'generatedData' directories. The python script used to generate representative +graph data is in the PathFinder_ref directory. It is named graph_gen.py. + +YAML output files can be generated by using the -y switch. + +Sample data sets are included in the "generatedData" and "scaleData" +subdirectories. The scaleData files are intended for performance +characterization. They are named with the convention: + x.adj_list +For expected results, see scaleData/README + +------------------------------------ +5. PathFinder search algorithm / pseudo code + +PathFinder does a modified depth-first search through the graph. For each +signature, PathFinder begins searching from the set of nodes which have the +first label in the signature. From these nodes, it finds a path to any node that +is labeled with the second label in the signature. This is repeated until a path +is found to the last label in the signature. If at any point in the search a +path to a label is not found, that search fails. + +Searches are done recursively. At each node, the target of each edge is checked +to see if it is labeled with the next label in the signature. If a match is +made, The search continues from the matched node and the subsequent label in the +signature. If there are no remaining labels in the signature, the search has +succeeded. If no direct edge from the current node matches, then the search +continues recursively for the current label along each edge from the current +node. If no match exists along any edge, the search fails. + +Pseudo code: + +For each file in config file: + Parse file into a Graph + +For each signature in config file: + Store for processing + +For each signature +{ + For each Graph + { + Make sure the graph contains at least one node labeled with every label + in the signature + + Get set of nodes with signature[0], the first label in signature + for each “Start” node + { + // Recursive procedure to find remaining signature. Requires + // current node, the remaining “unfound” signature legs + // a result stack of nodes to store path traversed and + // a stack of nodes visited so far to detect cycles and + // redundant searches + Create empty result stack + Create empty visited stack + success = FindRemainingSignatureFromCurrentNode ( startNode, + &signature[1], result, visited ) + } // end of for each “Start” node + } // end of for each Graph +} // end of for each Signature + + +// Recursive procedure to find remaining signature. +// currentNode – the node whose edges *might* reach the +// next label in the signature +// signature – an array of pointers to C strings. These strings +// are the labels being matched by the nodes being +// searched. Each sequential pair of labels is a +// “leg” of the search. The last pointer is NULL to +// terminate the array. +// result – a stack of nodes containing the path currently +// traversed to reach this node +// visited – a stack of ALL nodes searched during the attempt +// to find the current label + +boolean FindRemainingSignatureFromCurrentNode ( currentNode, signature, result, + visited ) +{ + If currentNode is in visited + return FALSE – we have reached a cycle or a subgraph that has + already been searched + else + push currentNode onto visited stack + + push currentNode onto result stack + For each edge from currentNode + { + If edge->targetNode->label == signature[0] + { + If signature[1] != NULL we have more legs in the search + Create nextResult for next leg search + Create nextVisited for next leg search + success = FindRemainingSignatureFromCurrentNode + ( edge->targetNode, &signature[1], + nextResult, nextVisited ) + if success + result += nextResult + delete nextVisited + return TRUE, we’ve found the path + else + continue through edge checking + else signature[1] == NULL + push edge->targetNode onto result + return true, we’ve found the path + } + else + continue through edge checking + } // end of for each edge target compared against signature [0] + + // If we’ve made it this far, none of the edges is a direct + // match to the current label, do a deeper search + For each edge from current node + { + success = FindRemainingSignatureFromCurrentNode ( edge->targetNode, + &signature[0], result, visited ) + if success + return TRUE, we’ve found the path + else + continue through edge searching loop + } + + // If we’ve made it this far, we have no path + pop currentNode off of result (but not off of visited) + return FALSE; +} // end of find remaining signature + + + + Index: test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/bitfield.h =================================================================== --- test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/bitfield.h +++ test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/bitfield.h @@ -0,0 +1,69 @@ +/************************************************************************* + * + * PathFinder: finding a series of labeled nodes within a + * two-layer directed, cyclic graph. + * Copyright (2013) Sandia Corporation + * + * Copyright (2013) Sandia Corporation. Under the terms of Contract + * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government + * retains certain rights in this software. + * + * This file is part of PathFinder. + * + * PathFinder is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * PathFinder is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with PathFinder. If not, see . + * + * Questions? Contact J. Brian Rigdon (jbrigdo@sandia.gov) + * + */ + +#ifndef BITFIELD_H +#define BITFIELD_H + +#include +#include +#include + +struct NodeStruct; + +/* -------- + * Bitfield is a mask around a character pointer. An array of character + * pointers is allocated such that there is a sequence of available bits + * equal in length to the number of nodes in a given graph. Bitfield + * defines operations that check if a bit corresponding to a node index + * is set. This is used by the graph traversal path finding algorithms + * to determine if a node has been visited. + */ + +typedef struct BitfieldStruct Bitfield; + +struct BitfieldStruct +{ + int bitsNeeded; /* in BYTES!!! */ + char *bitfield; +}; + + +Bitfield *Bitfield_new(int bitsNeeded); /* constructor */ +void Bitfield_delete(Bitfield *this); /* destructor */ + +/* Returns true if the specified node has been visited */ +bool Bitfield_nodeVisited(Bitfield *this, struct NodeStruct *node); + +/* Makes a byte-by-byte copy of the "from" bitfield */ +Bitfield *Bitfield_copy(Bitfield *from); + +void Bitfield_clear(); + +#endif + Index: test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/bitfield.c =================================================================== --- test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/bitfield.c +++ test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/bitfield.c @@ -0,0 +1,114 @@ +/************************************************************************* + * + * PathFinder: finding a series of labeled nodes within a + * two-layer directed, cyclic graph. + * Copyright (2013) Sandia Corporation + * + * Copyright (2013) Sandia Corporation. Under the terms of Contract + * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government + * retains certain rights in this software. + * + * This file is part of PathFinder. + * + * PathFinder is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * PathFinder is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with PathFinder. If not, see . + * + * Questions? Contact J. Brian Rigdon (jbrigdo@sandia.gov) + * + */ + +#include "bitfield.h" +#include "node.h" +#include + + +/* -------- + * Bitfield is a mask around a character pointer. An array of character + * pointers is allocated such that there is a sequence of available bits + * equal in length to the number of nodes in a given graph. Bitfield + * defines operations that check if a bit corresponding to a node index + * is set. This is used by the graph traversal path finding algorithms + * to determine if a node has been visited. + */ + + +/* constructor */ +Bitfield *Bitfield_new(int bitsNeeded) +{ + int size = (bitsNeeded+7) / 8; /* CHAR_BIT; */ + Bitfield *new = malloc(sizeof(Bitfield)); + if ( !new ) + return(NULL); + new->bitfield = calloc(size, sizeof(char)); + if ( !new->bitfield ) + { + free(new); + return(NULL); + } + + new->bitsNeeded = bitsNeeded; + return new; +} + +/* destructor */ +void Bitfield_delete(Bitfield *this) +{ + if ( this ) + { + if ( this->bitfield ) + free(this->bitfield); + free(this); + } +} + +/* Returns true if the specified node has been visited */ +bool Bitfield_nodeVisited(Bitfield *this, struct NodeStruct *node) +{ + int index = node->nodeCount >> 3; + char byte = this->bitfield[index]; + char bit = 1 << (node->nodeCount & 0x07); + bool set = byte & bit; + + this->bitfield[index] |= bit; + + /* printf ( "Inside Bitfield nodeVisited: Node: %d, index %d, byte %x, bit: %x\n", + node->nodeCount, index, byte, bit ); */ + return(set); +} + + +/* Makes a byte-by-byte copy of the "from" bitfield */ +Bitfield *Bitfield_copy(Bitfield *from) +{ + int i; + + if ( !from ) + return(NULL); + + Bitfield *new = Bitfield_new(from->bitsNeeded); + if ( new ) + { + for ( i = 0; i*8 < from->bitsNeeded; ++i ) + new->bitfield[i] = from->bitfield[i]; + return(new); + } + else + return(NULL); +} + + +void Bitfield_clear(Bitfield *this) +{ + int size = (this->bitsNeeded+7) / 8; + memset(this->bitfield, 0, size); +} Index: test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/configuration.h =================================================================== --- test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/configuration.h +++ test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/configuration.h @@ -0,0 +1,80 @@ +/************************************************************************* + * + * PathFinder: finding a series of labeled nodes within a + * two-layer directed, cyclic graph. + * Copyright (2013) Sandia Corporation + * + * Copyright (2013) Sandia Corporation. Under the terms of Contract + * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government + * retains certain rights in this software. + * + * This file is part of PathFinder. + * + * PathFinder is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * PathFinder is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with PathFinder. If not, see . + * + * Questions? Contact J. Brian Rigdon (jbrigdo@sandia.gov) + * + */ + + +/* + * configuration.h + * + * Created on: October 1, 2013 + * Author: Brian "Rig" Rigdon + */ + +#ifndef CONFIGURATION_H_ +#define CONFIGURATION_H_ + +#include +#include "graph.h" +#include "graphGen.h" + +/* I was hoping to avoid this - however because we are dealing with + * pointers to arrays of pointers, passing the address of an such + * a beast becomes really confusing: Graph *(**pointer)[] + * Ergo, I am building a structure to contain all the information + * necessary for a given running of this software. For lack of + * a better name, we are calling it the "configuration". + */ + +/* A simple enum to define which search is to be done */ +typedef enum { treeSearch, diagramSearch } SearchType; + +typedef struct SearchOptionsStruct SearchOptions; +struct SearchOptionsStruct +{ + SearchType searchType; + bool multiThreaded; + bool doStatistics; + bool writeOutputFile; + char *outputFile; + BuildType buildType; +}; + +SearchOptions * SearchOptions_new(); + +typedef struct ConfigurationStruct Configuration; +struct ConfigurationStruct +{ + Graph **graphs; /* a pointer to a NULL terminated array of pointers */ + Signature *signatures; /* a pointer to a NULL terminated array of Signatures */ + SearchOptions *searchOptions; + int qThreadCount; /* recursion depth to STOP spawning new tasks */ +}; + +Configuration* Configuration_new(); + +#endif /* CONFIGURATION_H_ */ Index: test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/configuration.c =================================================================== --- test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/configuration.c +++ test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/configuration.c @@ -0,0 +1,69 @@ +/************************************************************************* + * + * PathFinder: finding a series of labeled nodes within a + * two-layer directed, cyclic graph. + * Copyright (2013) Sandia Corporation + * + * Copyright (2013) Sandia Corporation. Under the terms of Contract + * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government + * retains certain rights in this software. + * + * This file is part of PathFinder. + * + * PathFinder is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * PathFinder is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with PathFinder. If not, see . + * + * Questions? Contact J. Brian Rigdon (jbrigdo@sandia.gov) + * + */ + +/* + * configuration.c + * + * Created on: October 1, 2013 + * Author: Brian "Rig" Rigdon + */ + +#include + #include "configuration.h" + + SearchOptions* SearchOptions_new() + { + SearchOptions *options = malloc(sizeof(SearchOptions)); + if ( !options ) + return(NULL); + options->searchType = treeSearch; + options->multiThreaded = false; + options->doStatistics = false; + options->writeOutputFile = false; + options->outputFile = NULL; + options->buildType = endNodesOnly; + return(options); + } + + Configuration* Configuration_new() + { + Configuration *new = malloc(sizeof(Configuration)); + SearchOptions *options = malloc(sizeof(SearchOptions)); + if ( !new || !options ) + { + if ( new ) free(new); + if ( options ) free(options); + return(NULL); + } + new->graphs = NULL; + new->signatures = NULL; + new->searchOptions = options; + new->qThreadCount = 0; + return(new); + } Index: test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/gettime.c =================================================================== --- test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/gettime.c +++ test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/gettime.c @@ -0,0 +1,43 @@ +/************************************************************************* + * + * PathFinder: finding a series of labeled nodes within a + * two-layer directed, cyclic graph. + * Copyright (2013) Sandia Corporation + * + * Copyright (2013) Sandia Corporation. Under the terms of Contract + * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government + * retains certain rights in this software. + * + * This file is part of PathFinder. + * + * PathFinder is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * PathFinder is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with PathFinder. If not, see . + * + * Questions? Contact J. Brian Rigdon (jbrigdo@sandia.gov) + * + */ + +#include +#ifdef USE_OMP +#include +#endif + +extern double currentTime() +{ +#ifdef USE_OMP + return omp_get_wtime(); +#else + return 0; +#endif +} + Index: test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/graph.h =================================================================== --- test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/graph.h +++ test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/graph.h @@ -0,0 +1,101 @@ +/************************************************************************* + * + * PathFinder: finding a series of labeled nodes within a + * two-layer directed, cyclic graph. + * Copyright (2013) Sandia Corporation + * + * Copyright (2013) Sandia Corporation. Under the terms of Contract + * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government + * retains certain rights in this software. + * + * This file is part of PathFinder. + * + * PathFinder is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * PathFinder is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with PathFinder. If not, see . + * + * Questions? Contact J. Brian Rigdon (jbrigdo@sandia.gov) + * + */ + + +/* + * Graph.h + * + * Created on: Jan 9, 2013 + * Author: Brian "Rig" Rigdon, Marcus Smith, Samuel Mulder + */ + + +/* -------- + * Graphs are made up of nodes and edges. Nodes hold data and edges + * connect nodes to each other. In this representation, edges are + * directional (they lead from one node to the next) and may create + * looped paths. The data sets from which these graphs are defined + * define two-layered graphs. The outer layer may contain one or + * more interior nodes. These interior nodes may be linked among each + * other. Each containing node may have up to two "entrance" nodes; + * that is, an edge goes from the containing node to its entrance node. + * + * As mentioned above, the graphs are defined in data files. The graph + * data structure contains the file name, a count of nodes, a list of + * exterior nodes, and structures that assist in the searching through + * the graph for "signatures" + */ + +#ifndef GRAPH_H_ +#define GRAPH_H_ + +#include /* bool is no longer part of the C language */ +#include "node.h" +#include "searchDiagram.h" +#include "systemCallMap.h" + + +/* ------------------------------------------- + * Graph Definitions + * + */ + +typedef struct GraphStruct Graph; + +struct GraphStruct +{ + char *fileName; /* the file parsed to give us this graph */ + int totalNodes; /* Nodes, both outer and interior */ + NodeList *outerNodes; /* The Linked-List capture of the node data */ + SearchDiagram *searchDiagram; /* The compressed Node/Edge search structures */ + SystemCallMap *systemCallMap; +}; + + +/* "methods" */ + +Graph *Graph_new(); /* Graph constructor */ +void Graph_delete( Graph *trash ); /* Destructor - erases current graph */ +bool Graph_addOuterNode( Graph *graph, Node *newOuterNode ); +/* Finds a node within the graph. If deep is true, we check interior nodes as well. + * If deep is false, we only check to see if the id is an outer node. This does NOT + * find the path to the node. + */ +Node *Graph_findNode( Graph *graph, int id, bool deep ); + + + +/* Determine if a given node contains the node specified by id. If this problem extended + * beyond two layers, this method would be recursive. Returns NULL if node is not contained. + * This does NOT find the path to the node. + */ +Node *Graph_findContainedNode( Node *node, int id ); + + +#endif /* GRAPH_H_ */ Index: test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/graph.c =================================================================== --- test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/graph.c +++ test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/graph.c @@ -0,0 +1,186 @@ +/************************************************************************* + * + * PathFinder: finding a series of labeled nodes within a + * two-layer directed, cyclic graph. + * Copyright (2013) Sandia Corporation + * + * Copyright (2013) Sandia Corporation. Under the terms of Contract + * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government + * retains certain rights in this software. + * + * This file is part of PathFinder. + * + * PathFinder is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * PathFinder is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with PathFinder. If not, see . + * + * Questions? Contact J. Brian Rigdon (jbrigdo@sandia.gov) + * + */ + +/* + * graph.c + * + * Created on: Jan 9, 2013 + * Author: Brian "Rig" Rigdon, Marcus Smith, Samuel Mulder + */ + +/* -------- + * Graphs are made up of nodes and edges. Nodes hold data and edges + * connect nodes to each other. In this representation, edges are + * directional (they lead from one node to the next) and may create + * looped paths. The data sets from which these graphs are defined + * define two-layered graphs. The outer layer may contain one or + * more interior nodes. These interior nodes may be linked among each + * other. Each containing node may have up to two "entrance" nodes; + * that is, an edge goes from the containing node to its entrance node. + * + * As mentioned above, the graphs are defined in data files. The graph + * data structure contains the file name, a count of nodes, a list of + * exterior nodes, and structures that assist in the searching through + * the graph for "signatures" + */ + +#include +#include +#include +#include +#include + +#ifdef USE_OMP +#include +#endif + +#include "graph.h" +#include "systemCallMap.h" +#include "bitfield.h" +#include "utils.h" + + + + +/* ------------------------------------------- + * Graph Method Definitions + * + */ +/* We deleted the code that made a graph singleton. Now we may have + * more than one graph. Ergo, the main method (or whatever) will maintain + * the graph pointer. + */ + +Graph *Graph_new() +{ + Graph *graph= NULL; + graph = malloc( sizeof( Graph )); + if ( graph ) + { + /* The malloc worked! */ + graph->fileName = NULL; + graph->totalNodes = 0; + graph->outerNodes = NULL; + graph->searchDiagram = NULL; + } + + return( graph ); +} + +/* Destructor - erases current graph, sets singleton to NULL */ +void Graph_delete( Graph *trash ) +{ + SearchDiagram *element; + if ( trash ) + { + free( trash->fileName ); + NodeList_clear( trash->outerNodes, true ); + if ( trash->searchDiagram ) { + for ( element = trash->searchDiagram; element->node != NULL; ++element ) + { + free( element->edgeReferenceArray ); + } + free( trash->searchDiagram ); + } + free( trash ); + } +} + +bool Graph_addOuterNode( Graph *graph, Node *newOuterNode ) +{ + /* a little basic error checking */ + if ( !graph || !newOuterNode ) + return (false); + + /* Is this the first outer node? */ + if ( graph->outerNodes == NULL ) /* Allocates singletonGraph if it's not there */ + { + graph->outerNodes = NodeList_new(); + if ( !graph->outerNodes ) + return( false ); /* the malloc failed */ + graph->outerNodes->node = newOuterNode; + return( true ); + } + + /* Otherwise, insert the new node at the tail of the singleton graph */ + return( NodeList_insertBack( graph->outerNodes, newOuterNode )); +} + + +/* Finds a node within the graph. If deep is true, we check interior nodes as well. + * If deep is false, we only check to see if the id is an outer node. This does NOT + * find the path to the node. + */ +Node *Graph_findNode( Graph *graph, int id, bool deep ) +{ + NodeList *nodes; + Node *node; + + for ( nodes = graph->outerNodes; nodes != NULL; nodes = nodes->nextNode ) + { + if ( nodes->node->id == id ) + return( nodes->node ); + /* If that wasn't the node, and we're going deep, see if it's there. */ + if ( deep ) + { + node = Graph_findContainedNode( nodes->node, id ); + if ( node ) + return( node ); + } + } + + return( NULL ); +} + + + + +/* Determine if a given node contains the node specified by id. If this problem extended + * beyond two layers, this method would be recursive. Returns NULL if node is not contained. + * This does NOT find the path to the node. + */ +Node *Graph_findContainedNode( Node *node, int id ) +{ + NodeList *nodes; + + for ( nodes = node->interiorNodes; nodes != NULL; nodes = nodes->nextNode ) + { + if ( nodes->node->id == id ) + return( nodes->node ); + } + + return( NULL ); +} + + + + + + +/* Search Algorithms */ Index: test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/graphGen.h =================================================================== --- test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/graphGen.h +++ test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/graphGen.h @@ -0,0 +1,52 @@ +/************************************************************************* + * + * PathFinder: finding a series of labeled nodes within a + * two-layer directed, cyclic graph. + * Copyright (2013) Sandia Corporation + * + * Copyright (2013) Sandia Corporation. Under the terms of Contract + * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government + * retains certain rights in this software. + * + * This file is part of PathFinder. + * + * PathFinder is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * PathFinder is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with PathFinder. If not, see . + * + * Questions? Contact J. Brian Rigdon (jbrigdo@sandia.gov) + * + */ + +/* + * graphGen.h + * + * Created on: Aug 2, 2013 + * Author: J. Brian Rigdon + */ + +#ifndef GRAPHGEN_H +#define GRAPHGEN_H + +#include "graph.h" + +typedef enum { endNodesOnly, labeledNodes, completePath } BuildType; + +Graph *buildGraphFromPaths(NodeVecVec **pathList, BuildType build); + +/* Write the given graph to a file */ +bool exportGraph(Graph *graph, char *fileName); + + + + +#endif /* GRAPHGEN_H_ */ Index: test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/graphGen.c =================================================================== --- test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/graphGen.c +++ test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/graphGen.c @@ -0,0 +1,195 @@ +/************************************************************************* + * + * PathFinder: finding a series of labeled nodes within a + * two-layer directed, cyclic graph. + * Copyright (2013) Sandia Corporation + * + * Copyright (2013) Sandia Corporation. Under the terms of Contract + * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government + * retains certain rights in this software. + * + * This file is part of PathFinder. + * + * PathFinder is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * PathFinder is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with PathFinder. If not, see . + * + * Questions? Contact J. Brian Rigdon (jbrigdo@sandia.gov) + * + */ + +/* + * graphGen.c + * + * Created on: Aug 2, 2013 + * Author: jbrigdo + */ + +#include +#include +#include "graphGen.h" +#include "vectorUtils.h" + + +/* getDuplicateNodeForGraph takes a node from another graph and sees if + * a duplicate has previously been created for this graph. If not, it tries + * to create and insert a new duplicate. If that fails, we're out of memory. + * In that circumstance, we have a significant error condition. It is + * time to delete the graph being built and report that error to the + * calling method (buildGraphFromPaths). + */ +static Node *getDuplicateNodeForGraph(Graph *graph, Node *from) +{ + Node *newNode = Graph_findNode(graph, from->id, true); /* true == deep search */ + if ( newNode ) + return(newNode); + + /* else */ + newNode = Node_duplicate(from, graph->totalNodes++ ); /* POST increment */ + if ( newNode ) + { + Graph_addOuterNode(graph,newNode); /* all nodes are exterior in this graph */ + newNode->type = exteriorNode; + return(newNode); + } + + /* else */ + Graph_delete(graph); /* Failure is DESTRUCTIVE at this point */ + return NULL; +} + + +Graph *buildGraphFromPaths(NodeVecVec **pathList, BuildType build) +{ + Graph *newGraph = Graph_new(); + Node *pathNode; /* The node we're looking at in the path */ + Node *currentNode; + Node *nextNode; + int i; /* Iterator through the path List array */ + int j; /* Iterator through each path List */ + int k; /* Iterator through each path in the path List */ + + if ( !pathList || !newGraph ) + return(NULL); + + for ( i = 0; pathList[i] ; ++i ) + { + for (j = 0; j < pathList[i]->contentSize; ++j) + { + pathNode = pathList[i]->vector[j]->vector[0]; + currentNode = getDuplicateNodeForGraph(newGraph, pathNode); + if ( !currentNode ) + return(NULL); /* out of memory: crashing! newGraph has already been cleaned up */ + + for ( k = 1; k < pathList[i]->vector[j]->contentSize; ++k /*also incremented below*/ ) + { + if ( build == endNodesOnly ) + { + k = pathList[i]->vector[j]->contentSize - 1; + } + else if ( build == labeledNodes ) + { + while ( pathList[i]->vector[j]->vector[k]->labelIdx < 0 ) + ++k; + } + /* else if ( build == completePath ) no-op */ + + pathNode = pathList[i]->vector[j]->vector[k]; + nextNode = getDuplicateNodeForGraph(newGraph, pathNode); + if ( !nextNode ) + return(NULL); /* out of memory: crashing! newGraph has already been cleaned up */ + Node_addEdgeToNode(currentNode, nextNode); + // printf ( "Adding edge: %d ==> %d\n", currentNode->id, nextNode->id ); + currentNode = nextNode; + } + } + } + + return(newGraph); +} + + +/* Write the given graph to a file */ +bool exportGraph(Graph *graph, char *fileName) +{ + FILE *out = NULL; + NodeList *nodes = NULL; + EdgeList *edges = NULL; + int nodeCount = 0; + + if ( !graph || !fileName ) /* A little basic error checking */ + return(false); + + out = fopen(fileName, "w"); + + if ( !out ) /* A little more basic error checking */ + return(false); + + /* Write out the header */ + /* ... find out how many functions (outer nodes) the graph holds */ + for ( nodes = graph->outerNodes; nodes != NULL; nodes = nodes->nextNode ) + { + ++nodeCount; + } + fprintf(out, "Functions: %d\n", nodeCount); + fprintf(out, "Basic blocks: %d\n\n", graph->totalNodes); + + /* First, write out the graph's outer nodes */ + for ( nodes = graph->outerNodes; nodes != NULL; nodes = nodes->nextNode ) + { + fprintf(out, "%d ", nodes->node->id); + //printf("Node: %d ", nodes->node->id); + if ( nodes->node->edges ) + { + nodeCount = 0; + /* Wow is this inefficient, but two passes is the easiest way to do it. */ + for ( edges = nodes->node->edges; edges != NULL; edges = edges->nextEdge ) + { + if ( edges->targetNode->type == exteriorNode ) + ++nodeCount; + } + fprintf(out, "%d ", nodeCount); + //printf("has %d edges: ", nodeCount); + for ( edges = nodes->node->edges; edges != NULL; edges = edges->nextEdge ) + { + if ( edges->targetNode->type == exteriorNode ) + { + fprintf(out, "%d ", edges->targetNodeId); + //printf("%d, ", edges->targetNodeId); + } + } + fprintf(out, "\n"); + //printf("\n"); + } + else + { + fprintf(out, "0 \n" ); + //printf(" no edges.\n"); + } + } + + /* then, for each of the outer nodes, write out its interior nodes (if any) */ + /* We are skipping this for the time being. This currently is being called with flat graphs. */ + + /* Finally, write out the labels. */ + fprintf(out, "-------------------------------------------- \nSYSTEM CALLS \n\n"); + + for ( nodes = graph->outerNodes; nodes != NULL; nodes = nodes->nextNode ) + { + if ( nodes->node->label != NULL ) + fprintf(out, "%d %s \n", nodes->node->id, nodes->node->label ); + /* If we were worried about interior nodes, we'd need a duplicate loop here. */ + } + + return(true); + +} Index: test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/main.c =================================================================== --- test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/main.c +++ test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/main.c @@ -0,0 +1,361 @@ +/************************************************************************* + * + * PathFinder: finding a series of labeled nodes within a + * two-layer directed, cyclic graph. + * Copyright (2013) Sandia Corporation + * + * Copyright (2013) Sandia Corporation. Under the terms of Contract + * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government + * retains certain rights in this software. + * + * This file is part of PathFinder. + * + * PathFinder is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * PathFinder is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with PathFinder. If not, see . + * + * Questions? Contact J. Brian Rigdon (jbrigdo@sandia.gov) + * + */ + +/* + * main.c + * + * Created on: Jan 9, 2013 + * Author: Brian "Rig" Rigdon, Marcus Smith, Samuel Mulder + */ + + +#include +#include +#include +#include +#include +#include +#include +#include "parsing.h" +#include "utils.h" +#include "searchAlgorithms.h" +#include "vectorUtils.h" +#include "statistics.h" +#include "configuration.h" + +#ifdef QT + #include "qThreadSearch.h" +#endif /* QT */ + +extern double currentTime(); + +#define helpString "\nUsage: PathFinder.exe [OPTIONS] []\n\n\ + Operation:\n\ + -c use configuration file\n\ + -i interactive search of specified data file\n\ + -x exhaustive leg search (any label to any label) of data file\n\n\ + Other:\n\ + -o save optimized graph to file\n\ + -h,u prints this help message.\n\ + -q use qthread parallelism (config file only). The depth value\n\ + specifies how deep in recursion to continue spawning new tasks\n\ + during searches\n\ + -y create YAML output\n" + +/* Forward declarations so that main is the first function we read */ +void runBatch(char *configFile, Configuration *config); +void runInteractively(char *fileName, Configuration *config); +void exhaustiveLegSearch(char *fileName, Configuration *config); + +int main(int argc, char *argv[]) +{ + char defaultFile[] = "MicroTestData.adj_list"; + char *fileName = NULL; + Configuration *config = Configuration_new(); + signed char c; + int cFlag = 0; // Why did I make these ints instead of bool? JBR - 10/25/13 + int iFlag = 0; + int xFlag = 0; + int tFlag = 0; + int dFlag = 0; + int oFlag = 0; + bool qFlag = 0; + int qCount = 0; + char commandLine[200]; + int i; + + printf ( "\n\n" + " PathFinder: finding a series of labeled nodes within a\n" + " two-layer directed, cyclic graph.\n" + " Copyright (2013) Sandia Corporation\n" + "\n" + " Sandia National Laboratories is a multi-program laboratory managed and\n" + " operated by Sandia Corporation, a wholly owned subsidiary of Lockheed\n" + " Martin Corporation, for the U.S. Department of Energy's National Nuclear\n" + " Security Administration under terms of Contract DE-AC04-94AL85000,\n" + " there is a non-exclusive license for use of this work by or on behalf\n" + " of the U.S. Government. Export of this program may require a license \n" + " from the United States Government.\n\n\n" ); + + #ifdef DEBUG + printf("\tRunning debug build\n\n"); + #endif + #ifdef OPENMP + printf("\tRunning Open MP build\n\n"); + #endif + #ifdef QT + printf("\tRunning Q Thread build\n\n"); + #endif + + if ( !config ) + { + printf("Error: Could not allocation configuration structure.\n\n\t---Exiting\n\n"); + exit(0); + } + + if ( argc < 2 ) + { + exhaustiveLegSearch(defaultFile, config); + } + else + { + while ( (c = getopt(argc, argv, "c:i:x:o:q:huy")) != -1 ) + { + switch (c) + { + case '?': /* we had a problem */ + if ( optopt == 'c' ) + fprintf(stderr, "\tPlease specify configuration file.\n\n"); + else if ( optopt == 'i' || optopt == 'x' ) + fprintf(stderr, "\tPlease specify data file.\n\n"); + else if ( optopt == 'o' ) + fprintf(stderr, "\tPlease specify output graph data file.\n\n"); + else if ( optopt == 'q' ) + fprintf(stderr, "\tPlease specify recursion depth to keep spawning tasks.\n\n"); + return(1); + break; /* Superfluous, I know */ + case 'h': + case 'u': + printf ("\n%s\n\n", helpString); + return(0); /* Nothing else matters */ + break; /* Superfluous, I know. */ + case 'c': /* configuration file */ + fileName = optarg; + cFlag = 1; + break; + case 'i': /* interactive */ + fileName = optarg; + iFlag = 1; + break; + case 'x': /* exhaustive leg search */ + fileName = optarg; + xFlag = 1; + break; + case 'o': /* Save optimized paths in a new graph definition data file */ + config->searchOptions->outputFile = optarg; + config->searchOptions->writeOutputFile = true; + oFlag = 1; + break; + case 's': + config->searchOptions->doStatistics = true; + break; + case 'q': + qCount = atoi(optarg); + if ( qCount < 1 ) + qCount = 1; + config->qThreadCount = qCount; + break; + case 'y': + if ( commandLine != NULL ) + { + YAMLOpen(); + commandLine[0] = '\0'; + for ( i = 0; i < argc; ++i ) + sprintf(commandLine, "%s %s", commandLine, argv[i] ); + YAMLWriteString("Command", commandLine+1); + } + break; + default : + break; + } + } + + /* Debug --* / + if (cFlag) printf ("cFlag "); + if (iFlag) printf ("iFlag "); + if (xFlag) printf ("xFlag "); + if (oFlag) printf ("oFlag "); + if (fileName) printf ( " - %s", fileName ); + if (outFile) printf ( " - %s", outFile); + printf ("\n"); + / *-- End Debug */ + + if ( (cFlag+iFlag+xFlag) > 1 ) + { + fprintf(stderr, "-c -i and -x are mutually exclusive, PathFinder can only do one of those.\n\n"); + return(1); + } + + if ( (cFlag+iFlag+xFlag) == 0 ) + { + fprintf(stderr, "-c (config file) -i (interactive) or -x (exhaustive) must be specified.\n\n"); + return(1); + } + + if ( oFlag && !xFlag ) + { + fprintf(stderr, "-o (optimized graph output) is only compatible with -x (exhaustive searches).\n\n"); + return(1); + } + + if ( cFlag ) + runBatch(fileName, config); + else if ( iFlag ) + runInteractively(fileName, config); + else + { + exhaustiveLegSearch(fileName, config); + } + } + + YAMLClose(); /* works even if YAML logging isn't present */ + return(0); /* zero means no error */ +} + +void runBatch(char *configFile, Configuration *config) +{ + bool success; + int i; + int j; + double tick, tock; + int hours; + int min; + double sec; + + if ( !configFile ) + { + printf("Error: No config file entered.\n\n\t---Exiting---"); + exit(0); + } + + // printf("config file: %s\n", configFile); + + tick = currentTime(); + success = parseConfigFile(configFile, config); + tock = currentTime(); + sec = tock-tick; + hours = (int)sec/3600; + sec = fmod( sec, 3600.0 ); + min = (int)sec/60; + sec = fmod(sec, 60.0); + printf ("\n\nOverall Parse Time: %02d:%02d:%02.3f\n", hours, min, sec); + + /* Debug --* / + for ( i = 0; config->signatures[i] != NULL; ++i ); + for ( j = 0; config->graphs[j] != NULL; ++j ); + printf( "%d files, %d signatures \n", j, i ); + exit(1); + / *-- End Debug */ + + if ( success ) + { + #ifdef QT + doMultiSearchesQT(config); + #else + doMultiSearches(config); + #endif + } + + printf ("\n\nSearches complete.\n"); +} + + +void runInteractively(char *fileName, Configuration *config) +{ + char stringBuffer[200]; + Graph *graph; + char *labels[25]; /* Do we need an interactive signature bigger than 25? */ + NodePtrVec *path = NULL; + bool success = false; + int i, j; + int fullIntSignature[3] = { 0, 0, -1 }; + + + graph = parseFile(fileName); + + if ( !graph ) + return; + + while ( 1 ) + { + i = 0; + do { + + printf("\nPlease insert a node label for this signature (\"\" to complete, \"bail\" to exit):\n"); + gets(stringBuffer); + + if ( strcmp (stringBuffer, "bail") == 0 ) + exit(1); + + if ( strcmp(stringBuffer, "") != 0 ) + { + labels[i] = strdup(stringBuffer); + ++i; + } + + } while ( i < 25 && strcmp(stringBuffer, "") != 0 ); + + labels[i] = NULL; + + /* Debug */ + printf("\nSignature: "); + for ( j = 0; j < i; ++j ) + { + printf("'%s'", labels[j]); + if ( j < i-1 ) + printf(" -> "); + else + printf("\n\n"); + } + /* end debug */ + + path = NodePtrVec_new(50); + success = findLabelPath(graph, (Signature)labels, path, config->searchOptions->searchType); + + /* Sanity check to verify that a valid path exists */ + if( success ) + { + /* printStack ( path ); */ + printf ("Found, resultant path has %d steps.\n", path->contentSize); + } + else + printf("\n\tPath not found for signature.\n"); + + NodePtrVec_delete(path); + } + +} + +void exhaustiveLegSearch(char *fileName, Configuration *config) +{ + Graph *graph; + int found; + + graph = parseFile(fileName); + + if ( !graph || !config ) + return; + + if ( config->searchOptions->outputFile == NULL ) + found = findAllPossibleLegs(graph, config->searchOptions->searchType); + else + found = findAndLogAllPossibleLegs(graph, config->searchOptions); + printf("\n\nTotal %d legs found\n\n", found); + Graph_delete(graph); +} Index: test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/medsmall1.adj_list =================================================================== --- test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/medsmall1.adj_list +++ test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/medsmall1.adj_list @@ -0,0 +1,6153 @@ +Functions: 500 +Basic blocks: 3463 + +0 0 +32000000 0 +34900000 0 +4600000 0 +39500000 0 +44100000 0 +48700000 0 +15700000 0 +36800000 0 +41400000 0 +18600000 0 +6300000 0 +46000000 0 +2300000 0 +3800000 0 +38700000 0 +43300000 0 +47900000 0 +18000000 0 +12600000 0 +31400000 0 +1100000 0 +36000000 0 +5700000 0 +40600000 0 +45200000 0 +20900000 0 +19500000 0 +24100000 0 +28700000 0 +33300000 0 +3000000 0 +37900000 0 +17400000 0 +6100000 0 +7600000 0 +42500000 0 +12200000 0 +47100000 0 +16800000 0 +21400000 0 +26000000 0 +20300000 0 +300000 0 +35200000 0 +4900000 0 +39800000 0 +43100000 0 +9500000 0 +44400000 0 +14100000 0 +49000000 0 +18700000 0 +23200000 0 +22000000 0 +23300000 0 +27900000 0 +2200000 0 +37100000 0 +49800000 0 +6800000 0 +30600000 0 +21000000 0 +11400000 0 +1800000 0 +19700000 0 +46300000 0 +16000000 0 +20600000 0 +25200000 0 +29800000 0 +34400000 0 +22600000 0 +5900000 0 +4100000 0 +39000000 0 +8700000 0 +43600000 0 +13300000 0 +48200000 0 +17900000 0 +22500000 0 +25500000 0 +27100000 0 +31700000 0 +1400000 0 +36300000 0 +6000000 1 37500000 +40900000 0 +10600000 0 +45500000 0 +15200000 0 +9200000 0 +5800000 0 +19800000 0 +24400000 0 +29000000 0 +33600000 0 +3300000 0 +38200000 0 +24900000 0 +7900000 0 +42800000 0 +12500000 1 33700000 +47400000 0 +17100000 19 1700000 6600000 41500000 27400000 23500000 37800000 5500000 14800000 42700000 10100000 36500000 12700000 25200000 31000000 26900000 32700000 28200000 6300000 29300000 +21700000 0 +26300000 0 +30900000 0 +27800000 0 +28100000 0 +600000 0 +35500000 0 +5200000 0 +40100000 0 +9800000 0 +44700000 0 +14400000 0 +49300000 0 +19000000 0 +11500000 0 +23600000 0 +28200000 0 +32800000 0 +2500000 0 +37400000 0 +7100000 0 +42000000 0 +11700000 0 +8000000 0 +31200000 0 +34700000 0 +30100000 0 +4400000 1 29100000 +39300000 0 +43900000 0 +48500000 0 +13800000 0 +24700000 0 +36600000 0 +40200000 0 +41200000 0 +10900000 0 +45800000 0 +29500000 0 +3600000 0 +38500000 0 +32400000 0 +8600000 1 40800000 +12800000 0 +47700000 0 +16100000 1 15400000 +900000 0 +35800000 0 +40400000 0 +10100000 0 +45000000 0 +14700000 0 +49600000 0 +19300000 0 +31800000 0 +14900000 1 30900000 +28500000 0 +33100000 0 +2800000 0 +37700000 0 +7400000 0 +42300000 0 +12000000 0 +46900000 0 +15500000 0 +16600000 0 +21200000 0 +25800000 0 +30400000 0 +100000 0 +35000000 0 +18400000 0 +8400000 0 +39600000 0 +9300000 0 +44200000 0 +13900000 0 +48800000 0 +18500000 0 +23100000 0 +27700000 0 +34100000 0 +32300000 0 +2000000 0 +36900000 0 +6600000 0 +41500000 0 +11200000 0 +46100000 0 +15800000 0 +24200000 0 +33900000 0 +20400000 0 +25000000 0 +29600000 0 +34200000 0 +3900000 0 +38800000 0 +8500000 0 +20700000 0 +13100000 0 +48000000 0 +17700000 0 +22300000 0 +26900000 0 +31500000 0 +17200000 0 +27400000 0 +1200000 0 +36100000 0 +40700000 0 +10400000 0 +45300000 0 +15000000 0 +49900000 0 +49500000 0 +19600000 0 +30300000 0 +11100000 0 +20100000 0 +28800000 0 +33400000 0 +3100000 1 34600000 +38000000 0 +7700000 0 +42600000 0 +12300000 0 +47200000 0 +23000000 0 +1700000 0 +16900000 0 +46600000 0 +37000000 0 +17800000 0 +8200000 0 +21500000 0 +26100000 0 +30700000 0 +400000 0 +35300000 0 +5000000 0 +39900000 0 +9600000 0 +44500000 0 +14200000 0 +49100000 0 +18800000 0 +23400000 0 +28000000 0 +22400000 0 +27200000 0 +37200000 0 +6900000 0 +41800000 0 +46400000 0 +25300000 0 +34500000 1 8100000 +39100000 0 +43700000 0 +9000000 1 7000000 +1500000 0 +48300000 0 +5500000 0 +36400000 0 +41000000 0 +45600000 0 +27600000 0 +7800000 0 +33700000 0 +3400000 0 +38300000 0 +42900000 0 +41700000 0 +47500000 0 +11300000 0 +21800000 1 1300000 +26400000 0 +31000000 0 +700000 0 +35600000 0 +5300000 0 +27000000 0 +4500000 0 +9900000 0 +44800000 0 +14500000 0 +49400000 0 +19100000 0 +23700000 0 +28300000 0 +29900000 0 +32900000 0 +2600000 0 +37500000 0 +7200000 0 +42100000 0 +11800000 0 +46700000 0 +16400000 0 +13600000 0 +26800000 0 +25600000 0 +30200000 0 +34800000 0 +39400000 0 +9100000 0 +44000000 0 +29300000 0 +13700000 0 +48600000 0 +18300000 0 +22900000 0 +27500000 0 +32100000 0 +32200000 0 +10700000 0 +6400000 0 +41300000 0 +11000000 0 +45900000 0 +15600000 0 +20200000 1 31600000 +24800000 0 +15900000 0 +29400000 73 48400000 17800000 29100000 10700000 36800000 15100000 30200000 10400000 2200000 18400000 26600000 35900000 32400000 41700000 12600000 9100000 2100000 14900000 46900000 900000 23000000 9000000 7800000 17100000 48500000 5400000 37100000 24000000 17000000 13500000 10000000 21600000 30900000 36200000 10500000 46000000 600000 40900000 34300000 2900000 21500000 43600000 27300000 45900000 49800000 28400000 34200000 49300000 30500000 13200000 35300000 6200000 28300000 34100000 1500000 37500000 22700000 4900000 36300000 45600000 43700000 33800000 22300000 44400000 5900000 46700000 47200000 18800000 4600000 35000000 31500000 40800000 37300000 +34000000 0 +3700000 0 +38600000 0 +8300000 0 +43200000 0 +12900000 169 32000000 25600000 14000000 37200000 9200000 46400000 48700000 16100000 30100000 4400000 39300000 6700000 41600000 27600000 11300000 15900000 18200000 20500000 39100000 41400000 25100000 5800000 3900000 29700000 13400000 36700000 15700000 18000000 20300000 38900000 43500000 27200000 48100000 31800000 15500000 40700000 24700000 8400000 43400000 31600000 15300000 1300000 3600000 22200000 38800000 15000000 45400000 31400000 33700000 36000000 19700000 22000000 5700000 28900000 36900000 33500000 17200000 35800000 3200000 45000000 47300000 700000 35600000 5300000 46200000 26100000 42500000 47100000 33100000 35400000 19100000 2800000 5000000 42300000 26000000 9700000 26700000 14300000 16600000 300000 18900000 21200000 43100000 25800000 23900000 100000 2400000 26400000 24400000 27900000 11600000 16200000 34800000 18500000 20800000 23100000 6800000 1800000 21300000 7400000 30000000 34600000 18300000 2000000 8900000 43800000 27500000 32100000 15800000 34400000 3400000 7500000 6400000 11000000 13300000 31900000 15600000 17900000 20200000 41100000 24800000 35100000 27100000 45700000 13100000 31700000 34000000 17700000 3700000 24600000 43200000 10600000 29200000 1200000 30600000 3500000 43000000 45300000 47600000 31300000 49900000 33600000 49500000 3300000 21900000 48900000 12500000 19400000 21700000 26300000 26200000 26500000 16900000 19200000 5200000 42400000 44700000 14400000 16700000 400000 48300000 7300000 25900000 44500000 46800000 49100000 21100000 23400000 11700000 +47800000 0 +31600000 0 +26600000 0 +22100000 0 +26700000 0 +31300000 0 +1000000 0 +35900000 0 +5600000 0 +40500000 0 +15300000 0 +10200000 0 +45100000 0 +14800000 0 +49700000 0 +19400000 0 +24000000 0 +28600000 0 +18200000 0 +10500000 0 +33200000 0 +2900000 0 +37800000 0 +7500000 0 +42400000 0 +12100000 0 +47000000 0 +16700000 0 +21300000 0 +1900000 0 +25900000 0 +30500000 0 +200000 0 +35100000 0 +4800000 0 +39700000 0 +9400000 0 +44300000 0 +17600000 0 +4000000 0 +48900000 0 +2100000 0 +20500000 0 +6700000 0 +41600000 0 +46200000 0 +4200000 0 +10300000 0 +36700000 0 +17500000 0 +34300000 0 +38900000 0 +43500000 0 +48100000 0 +19900000 0 +43400000 0 +14600000 0 +1300000 0 +36200000 0 +40800000 0 +22800000 0 +13400000 0 +45400000 0 +15100000 0 +24300000 0 +6500000 0 +33500000 0 +3200000 0 +38100000 0 +42700000 0 +12400000 1 26200000 +47300000 0 +17000000 0 +21600000 0 +22200000 0 +32500000 0 +26200000 0 +30800000 0 +500000 0 +35400000 0 +5100000 0 +40000000 0 +9700000 0 +44600000 0 +25100000 0 +14300000 0 +49200000 0 +18900000 0 +23500000 0 +32700000 16 17600000 21000000 3800000 48000000 47700000 39800000 28700000 38000000 37700000 34500000 1600000 39400000 22500000 9400000 11100000 37600000 +2400000 1 16400000 +37300000 0 +8800000 0 +13200000 0 +7000000 0 +41900000 0 +11600000 0 +46500000 0 +16200000 0 +20800000 0 +25400000 0 +24500000 0 +30000000 0 +34600000 0 +4300000 0 +39200000 0 +8900000 0 +43800000 0 +13500000 0 +48400000 0 +18100000 0 +33800000 0 +29100000 0 +22700000 0 +27300000 0 +31900000 0 +1600000 0 +36500000 0 +6200000 0 +41100000 0 +4700000 0 +10800000 0 +45700000 0 +15400000 0 +20000000 0 +24600000 0 +29200000 0 +14000000 0 +13000000 0 +3500000 0 +38400000 0 +8100000 1 3100000 +43000000 0 +23900000 0 +12700000 0 +47600000 0 +17300000 0 +21900000 0 +29700000 0 +26500000 0 +31100000 0 +800000 0 +35700000 132 0 31200000 32600000 18600000 2300000 39500000 23200000 6900000 44100000 27800000 34700000 28500000 1900000 6500000 8800000 42600000 20700000 17500000 36600000 22600000 10900000 29500000 11900000 20100000 22400000 41000000 43300000 27000000 13000000 24200000 14600000 33900000 19900000 38500000 19600000 48600000 17400000 1100000 42900000 47500000 49700000 19500000 38100000 40400000 14700000 33300000 3000000 37900000 33400000 34900000 7600000 9900000 44800000 30800000 49400000 16800000 500000 21400000 5100000 12000000 12300000 49200000 32900000 35200000 47900000 4700000 11800000 16400000 18700000 13600000 36400000 41900000 46500000 48800000 40200000 11400000 44000000 40500000 16000000 20600000 46100000 29800000 9800000 32300000 20400000 39000000 41300000 29600000 30300000 29400000 15400000 20000000 6000000 8300000 10800000 21800000 36100000 19800000 38400000 22100000 17300000 38200000 5600000 23300000 42800000 10200000 47400000 800000 7000000 28100000 33200000 46600000 37000000 8200000 23800000 47000000 33000000 19000000 2700000 16300000 23600000 42200000 14200000 32800000 2500000 37400000 4800000 39700000 7100000 42000000 25700000 44300000 +5400000 1 42700000 +40300000 0 +10000000 0 +44900000 0 +32600000 0 +28900000 0 +19200000 0 +23800000 0 +28400000 1 42600000 +33000000 0 +2700000 0 +37600000 0 +16300000 0 +7300000 0 +42200000 0 +11900000 0 +46800000 88 12800000 8000000 41800000 13800000 9300000 25300000 29900000 32200000 4200000 22800000 44200000 10300000 4000000 8600000 45800000 43900000 38700000 6100000 24500000 45200000 25400000 38300000 24300000 20900000 24100000 12400000 49600000 19300000 28600000 4500000 12200000 14500000 40000000 23700000 44600000 13900000 2600000 7200000 42100000 9500000 30400000 14100000 49000000 39200000 41200000 39600000 27700000 32500000 46300000 4300000 22900000 11200000 18100000 29000000 45100000 4100000 25000000 8700000 48200000 8500000 25500000 1400000 38600000 45500000 47800000 15200000 26800000 1000000 24900000 7900000 28800000 31100000 35700000 40300000 7700000 44900000 40600000 13700000 35500000 40100000 12100000 30700000 11500000 39900000 9600000 16500000 200000 28000000 +16500000 0 +21100000 0 +25700000 0 + +-------------------------------------------- +0 +0 2 0 1 +1 1 2 +2 1 3 +3 1 4 +4 1 5 +5 1 4 + +-------------------------------------------- +32000000 +32000000 1 32000001 +32000001 2 32000001 32000002 +32000002 1 32000003 +32000003 1 32000004 +32000004 1 32000005 +32000005 2 32000002 32000006 +32000006 1 32000007 +32000007 1 32000008 +32000008 2 32000009 32000006 +32000009 2 32000010 32000003 +32000010 1 32000011 +32000011 2 32000009 32000012 +32000012 2 32000008 32000013 +32000013 2 32000001 32000014 +32000014 1 32000010 + +-------------------------------------------- +34900000 +34900000 1 34900001 +34900001 1 34900002 +34900002 1 34900003 +34900003 1 34900004 +34900004 0 + +-------------------------------------------- +4600000 +4600000 1 4600001 +4600001 1 4600002 +4600002 2 4600000 4600003 +4600003 2 4600001 4600004 +4600004 1 4600005 +4600005 2 4600002 4600006 +4600006 0 + +-------------------------------------------- +39500000 +39500000 1 39500001 +39500001 1 39500002 +39500002 1 39500003 +39500003 0 + +-------------------------------------------- +44100000 +44100000 2 44100001 44100002 +44100001 1 44100002 +44100002 1 44100000 + +-------------------------------------------- +15700000 +15700000 1 15700001 +15700001 0 + +-------------------------------------------- +1900000 +1900000 1 1900001 +1900001 1 1900002 +1900002 1 1900000 + +-------------------------------------------- +6500000 +6500000 2 6500000 6500001 +6500001 0 + +-------------------------------------------- +18600000 +18600000 2 18600000 18600001 +18600001 1 18600002 +18600002 1 18600003 +18600003 2 18600001 18600004 +18600004 1 18600005 +18600005 1 18600006 +18600006 1 18600007 +18600007 1 18600001 + +-------------------------------------------- +47900000 +47900000 0 + +-------------------------------------------- +2300000 +2300000 1 2300000 + +-------------------------------------------- +8400000 +8400000 2 8400000 8400001 +8400001 2 8400002 8400004 +8400002 2 8400002 8400003 +8400003 2 8400000 8400004 +8400004 1 8400002 + +-------------------------------------------- +13000000 +13000000 1 13000001 +13000001 2 13000000 13000002 +13000002 0 + +-------------------------------------------- +17600000 +17600000 0 + +-------------------------------------------- +22200000 +22200000 1 22200001 +22200001 2 22200001 22200002 +22200002 1 22200003 +22200003 2 22200003 22200004 +22200004 2 22200003 22200005 +22200005 1 22200006 +22200006 2 22200000 22200007 +22200007 1 22200006 + +-------------------------------------------- +37200000 +37200000 1 37200000 + +-------------------------------------------- +12600000 +12600000 1 12600001 +12600001 2 12600002 12600010 +12600002 1 12600003 +12600003 1 12600004 +12600004 2 12600002 12600005 +12600005 2 12600000 12600006 +12600006 1 12600007 +12600007 1 12600008 +12600008 2 12600009 12600004 +12600009 2 12600010 12600005 +12600010 2 12600009 12600011 +12600011 1 12600012 +12600012 0 + +-------------------------------------------- +26800000 +26800000 0 + +-------------------------------------------- +1100000 +1100000 2 1100001 1100003 +1100001 1 1100002 +1100002 1 1100003 +1100003 1 1100004 +1100004 1 1100005 +1100005 1 1100006 +1100006 2 1100001 1100007 +1100007 1 1100008 +1100008 1 1100004 + +-------------------------------------------- +36000000 +36000000 1 36000000 + +-------------------------------------------- +40600000 +40600000 2 40600000 40600001 +40600001 1 40600001 + +-------------------------------------------- +10300000 +10300000 2 10300000 10300001 +10300001 1 10300002 +10300002 0 + +-------------------------------------------- +45200000 +45200000 1 45200001 +45200001 1 45200002 +45200002 2 45200003 45200004 +45200003 1 45200004 +45200004 1 45200005 +45200005 2 45200006 45200007 +45200006 1 45200007 +45200007 2 45200008 45200005 +45200008 0 + +-------------------------------------------- +1700000 +1700000 2 1700001 1700005 +1700001 1 1700002 +1700002 1 1700003 +1700003 1 1700004 +1700004 1 1700005 +1700005 1 1700006 +1700006 1 1700007 +1700007 2 1700008 1700002 +1700008 2 1700009 1700004 +1700009 0 + +-------------------------------------------- +19500000 +19500000 1 19500001 +19500001 2 19500001 19500002 +19500002 1 19500003 +19500003 1 19500004 +19500004 0 + +-------------------------------------------- +24100000 +24100000 1 24100001 +24100001 1 24100002 +24100002 2 24100003 24100007 +24100003 1 24100004 +24100004 2 24100003 24100005 +24100005 2 24100000 24100006 +24100006 2 24100001 24100007 +24100007 1 24100008 +24100008 0 + +-------------------------------------------- +28700000 +28700000 1 28700001 +28700001 0 + +-------------------------------------------- +3000000 +3000000 1 3000001 +3000001 1 3000002 +3000002 2 3000003 3000004 +3000003 1 3000004 +3000004 0 + +-------------------------------------------- +37900000 +37900000 1 37900001 +37900001 1 37900002 +37900002 2 37900002 37900003 +37900003 2 37900000 37900004 +37900004 1 37900002 + +-------------------------------------------- +36600000 +36600000 1 36600001 +36600001 0 + +-------------------------------------------- +25300000 +25300000 2 25300000 25300001 +25300001 1 25300000 + +-------------------------------------------- +7600000 +7600000 1 7600001 +7600001 2 7600002 7600005 +7600002 1 7600003 +7600003 2 7600001 7600004 +7600004 2 7600003 7600005 +7600005 2 7600002 7600006 +7600006 1 7600006 + +-------------------------------------------- +12200000 +12200000 1 12200001 +12200001 1 12200002 +12200002 1 12200000 + +-------------------------------------------- +47100000 +47100000 1 47100001 +47100001 0 + +-------------------------------------------- +16800000 +16800000 1 16800001 +16800001 2 16800000 16800002 +16800002 1 16800003 +16800003 1 16800004 +16800004 2 16800001 16800005 +16800005 1 16800006 +16800006 1 16800007 +16800007 1 16800008 +16800008 1 16800009 +16800009 1 16800010 +16800010 1 16800001 + +-------------------------------------------- +21400000 +21400000 2 21400001 21400003 +21400001 1 21400002 +21400002 1 21400003 +21400003 2 21400004 21400005 +21400004 2 21400004 21400005 +21400005 1 21400000 + +-------------------------------------------- +26000000 +26000000 1 26000001 +26000001 1 26000002 +26000002 0 + +-------------------------------------------- +20300000 +20300000 1 20300000 + +-------------------------------------------- +300000 +300000 1 300001 +300001 1 300002 +300002 1 300003 +300003 1 300004 +300004 1 300005 +300005 1 300006 +300006 1 300005 + +-------------------------------------------- +35200000 +35200000 1 35200001 +35200001 0 + +-------------------------------------------- +4900000 +4900000 2 4900000 4900001 +4900001 2 4900001 4900002 +4900002 0 + +-------------------------------------------- +39800000 +39800000 1 39800000 + +-------------------------------------------- +9500000 +9500000 1 9500001 +9500001 1 9500002 +9500002 2 9500000 9500003 +9500003 2 9500003 9500004 +9500004 2 9500018 9500005 +9500005 2 9500012 9500006 +9500006 1 9500007 +9500007 1 9500008 +9500008 1 9500009 +9500009 1 9500010 +9500010 2 9500016 9500011 +9500011 2 9500012 9500013 +9500012 1 9500013 +9500013 2 9500010 9500014 +9500014 2 9500019 9500015 +9500015 2 9500016 9500012 +9500016 2 9500017 9500006 +9500017 2 9500018 9500010 +9500018 1 9500019 +9500019 1 9500014 + +-------------------------------------------- +44400000 +44400000 2 44400000 44400001 +44400001 1 44400002 +44400002 1 44400003 +44400003 1 44400004 +44400004 2 44400001 44400005 +44400005 1 44400006 +44400006 0 + +-------------------------------------------- +4700000 +4700000 1 4700001 +4700001 2 4700000 4700002 +4700002 1 4700003 +4700003 1 4700004 +4700004 0 + +-------------------------------------------- +14100000 +14100000 2 14100000 14100001 +14100001 2 14100002 14100003 +14100002 1 14100003 +14100003 0 + +-------------------------------------------- +18700000 +18700000 2 18700000 18700001 +18700001 0 + +-------------------------------------------- +23200000 +23200000 0 + +-------------------------------------------- +41200000 +41200000 1 41200001 +41200001 1 41200002 +41200002 1 41200002 + +-------------------------------------------- +23300000 +23300000 1 23300001 +23300001 1 23300002 +23300002 2 23300003 23300005 +23300003 2 23300009 23300004 +23300004 1 23300005 +23300005 2 23300003 23300006 +23300006 2 23300016 23300007 +23300007 1 23300008 +23300008 2 23300009 23300002 +23300009 1 23300010 +23300010 2 23300010 23300011 +23300011 1 23300012 +23300012 2 23300013 23300006 +23300013 1 23300014 +23300014 1 23300015 +23300015 2 23300016 23300011 +23300016 1 23300004 + +-------------------------------------------- +27900000 +27900000 2 27900001 27900002 +27900001 1 27900002 +27900002 2 27900001 27900003 +27900003 2 27900002 27900004 +27900004 0 + +-------------------------------------------- +32500000 +32500000 1 32500001 +32500001 1 32500002 +32500002 1 32500003 +32500003 2 32500002 32500004 +32500004 1 32500001 + +-------------------------------------------- +2200000 +2200000 1 2200001 +2200001 0 + +-------------------------------------------- +37100000 +37100000 2 37100000 37100001 +37100001 2 37100002 37100007 +37100002 1 37100003 +37100003 1 37100004 +37100004 2 37100001 37100005 +37100005 1 37100006 +37100006 1 37100007 +37100007 1 37100000 + +-------------------------------------------- +49800000 +49800000 1 49800001 +49800001 2 49800000 49800002 +49800002 1 49800003 +49800003 1 49800004 +49800004 1 49800005 +49800005 1 49800006 +49800006 0 + +-------------------------------------------- +40200000 +40200000 1 40200000 + +-------------------------------------------- +41700000 +41700000 2 41700001 41700002 +41700001 2 41700001 41700002 +41700002 0 + +-------------------------------------------- +21000000 +21000000 1 21000000 + +-------------------------------------------- +11400000 +11400000 1 11400001 +11400001 2 11400002 11400005 +11400002 2 11400000 11400003 +11400003 1 11400004 +11400004 2 11400003 11400005 +11400005 2 11400001 11400006 +11400006 1 11400007 +11400007 1 11400008 +11400008 1 11400001 + +-------------------------------------------- +1800000 +1800000 2 1800001 1800005 +1800001 1 1800002 +1800002 1 1800003 +1800003 1 1800004 +1800004 1 1800005 +1800005 2 1800002 1800006 +1800006 2 1800002 1800007 +1800007 1 1800000 + +-------------------------------------------- +6900000 +6900000 1 6900001 +6900001 1 6900002 +6900002 2 6900003 6900007 +6900003 2 6900000 6900004 +6900004 2 6900003 6900005 +6900005 1 6900006 +6900006 1 6900007 +6900007 1 6900008 +6900008 2 6900000 6900009 +6900009 1 6900006 + +-------------------------------------------- +46300000 +46300000 1 46300001 +46300001 2 46300001 46300002 +46300002 0 + +-------------------------------------------- +16000000 +16000000 1 16000001 +16000001 2 16000002 16000010 +16000002 1 16000003 +16000003 1 16000004 +16000004 2 16000010 16000005 +16000005 1 16000006 +16000006 2 16000003 16000007 +16000007 2 16000008 16000006 +16000008 1 16000009 +16000009 1 16000010 +16000010 1 16000011 +16000011 1 16000012 +16000012 1 16000005 + +-------------------------------------------- +20600000 +20600000 1 20600001 +20600001 2 20600002 20600006 +20600002 2 20600000 20600003 +20600003 1 20600004 +20600004 1 20600005 +20600005 1 20600006 +20600006 1 20600007 +20600007 1 20600008 +20600008 1 20600009 +20600009 2 20600010 20600004 +20600010 1 20600011 +20600011 1 20600012 +20600012 2 20600001 20600013 +20600013 2 20600013 20600014 +20600014 0 + +-------------------------------------------- +30600000 +30600000 1 30600001 +30600001 0 + +-------------------------------------------- +25200000 +25200000 1 25200001 +25200001 1 25200002 +25200002 0 + +-------------------------------------------- +29800000 +29800000 1 29800001 +29800001 1 29800002 +29800002 0 + +-------------------------------------------- +41800000 +41800000 1 41800001 +41800001 2 41800001 41800002 +41800002 2 41800000 41800003 +41800003 0 + +-------------------------------------------- +9100000 +9100000 1 9100001 +9100001 1 9100002 +9100002 1 9100000 + +-------------------------------------------- +4100000 +4100000 1 4100001 +4100001 1 4100002 +4100002 2 4100002 4100003 +4100003 1 4100000 + +-------------------------------------------- +43600000 +43600000 2 43600000 43600001 +43600001 1 43600002 +43600002 0 + +-------------------------------------------- +13300000 +13300000 0 + +-------------------------------------------- +48200000 +48200000 1 48200001 +48200001 1 48200000 + +-------------------------------------------- +17900000 +17900000 1 17900001 +17900001 0 + +-------------------------------------------- +22500000 +22500000 2 22500001 22500006 +22500001 1 22500002 +22500002 1 22500003 +22500003 1 22500004 +22500004 1 22500005 +22500005 1 22500006 +22500006 1 22500006 + +-------------------------------------------- +6300000 +6300000 1 6300001 +6300001 1 6300002 +6300002 1 6300003 +6300003 1 6300004 +6300004 1 6300005 +6300005 1 6300006 +6300006 1 6300000 + +-------------------------------------------- +27100000 +27100000 2 27100000 27100001 +27100001 0 + +-------------------------------------------- +1400000 +1400000 1 1400000 + +-------------------------------------------- +36300000 +36300000 1 36300001 +36300001 2 36300002 36300006 +36300002 1 36300003 +36300003 1 36300004 +36300004 2 36300002 36300005 +36300005 1 36300006 +36300006 1 36300004 + +-------------------------------------------- +6000000 +6000000 1 6000001 +6000001 1 6000002 +6000002 1 37500000 + +-------------------------------------------- +40900000 +40900000 1 40900000 + +-------------------------------------------- +10600000 +10600000 0 + +-------------------------------------------- +45500000 +45500000 1 45500001 +45500001 1 45500002 +45500002 2 45500000 45500003 +45500003 1 45500004 +45500004 2 45500003 45500005 +45500005 1 45500006 +45500006 0 + +-------------------------------------------- +15200000 +15200000 1 15200001 +15200001 1 15200002 +15200002 1 15200003 +15200003 1 15200004 +15200004 2 15200003 15200005 +15200005 1 15200001 + +-------------------------------------------- +9200000 +9200000 1 9200001 +9200001 1 9200000 + +-------------------------------------------- +31400000 +31400000 1 31400001 +31400001 1 31400002 +31400002 1 31400003 +31400003 1 31400004 +31400004 2 31400002 31400005 +31400005 1 31400006 +31400006 0 + +-------------------------------------------- +19800000 +19800000 0 + +-------------------------------------------- +24400000 +24400000 2 24400001 24400003 +24400001 1 24400002 +24400002 1 24400003 +24400003 2 24400003 24400004 +24400004 1 24400003 + +-------------------------------------------- +29000000 +29000000 1 29000000 + +-------------------------------------------- +33600000 +33600000 1 33600001 +33600001 1 33600001 + +-------------------------------------------- +3300000 +3300000 1 3300001 +3300001 1 3300002 +3300002 1 3300003 +3300003 2 3300001 3300004 +3300004 2 3300004 3300005 +3300005 0 + +-------------------------------------------- +38200000 +38200000 1 38200001 +38200001 2 38200002 38200003 +38200002 1 38200003 +38200003 1 38200004 +38200004 1 38200005 +38200005 0 + +-------------------------------------------- +24900000 +24900000 1 24900001 +24900001 1 24900002 +24900002 1 24900003 +24900003 2 24900002 24900004 +24900004 1 24900005 +24900005 1 24900006 +24900006 1 24900007 +24900007 1 24900008 +24900008 2 24900009 24900006 +24900009 1 24900010 +24900010 2 24900011 24900005 +24900011 1 24900001 + +-------------------------------------------- +7900000 +7900000 1 7900001 +7900001 1 7900002 +7900002 1 7900003 +7900003 2 7900000 7900004 +7900004 1 7900005 +7900005 1 7900006 +7900006 2 7900004 7900007 +7900007 0 + +-------------------------------------------- +42800000 +42800000 1 42800001 +42800001 1 42800002 +42800002 2 42800000 42800003 +42800003 0 + +-------------------------------------------- +12500000 +12500000 1 12500001 +12500001 1 12500002 +12500002 1 12500003 +12500003 2 12500003 12500004 +12500004 2 12500004 12500005 +12500005 2 12500004 12500006 +12500006 2 12500006 12500007 +12500007 2 12500008 12500006 +12500008 2 12500007 33700000 + +-------------------------------------------- +47400000 +47400000 0 + +-------------------------------------------- +17100000 +17100032 2 17100033 17100028 +17100033 2 17100033 17100034 +17100034 2 17100035 14800000 +17100035 2 17100028 17100036 +17100036 2 17100037 41500000 +17100037 2 17100038 42700000 +17100038 2 17100035 17100039 +17100039 2 17100040 1700000 +17100040 2 17100041 6600000 +17100041 2 17100042 36500000 +17100042 2 17100043 28200000 +17100043 1 27400000 +17100000 2 17100001 10100000 +17100001 2 17100002 31000000 +17100002 2 17100003 17100030 +17100003 2 17100043 17100004 +17100004 2 17100005 5500000 +17100005 2 17100006 17100031 +17100006 2 17100011 17100007 +17100007 1 17100008 +17100008 2 17100009 17100001 +17100009 1 17100010 +17100010 2 17100011 26900000 +17100011 2 17100012 25200000 +17100012 2 17100009 17100013 +17100013 2 17100014 17100007 +17100014 2 17100015 37800000 +17100015 2 17100016 12700000 +17100016 2 17100017 23500000 +17100017 2 17100018 17100037 +17100018 2 17100019 29300000 +17100019 2 17100020 6300000 +17100020 2 17100003 17100021 +17100021 1 17100022 +17100022 2 17100020 17100023 +17100023 2 17100024 17100041 +17100024 2 17100025 17100020 +17100025 2 17100026 17100023 +17100026 2 17100010 17100027 +17100027 2 17100028 32700000 +17100028 2 17100029 17100022 +17100029 2 17100014 17100030 +17100030 2 17100034 17100031 +17100031 2 17100032 17100023 + +-------------------------------------------- +21700000 +21700000 1 21700001 +21700001 0 + +-------------------------------------------- +26300000 +26300000 1 26300001 +26300001 1 26300002 +26300002 1 26300003 +26300003 2 26300002 26300004 +26300004 1 26300005 +26300005 1 26300006 +26300006 1 26300007 +26300007 2 26300008 26300007 +26300008 0 + +-------------------------------------------- +30900000 +30900000 0 + +-------------------------------------------- +27800000 +27800000 1 27800000 + +-------------------------------------------- +5700000 +5700000 1 5700001 +5700001 2 5700002 5700007 +5700002 1 5700003 +5700003 1 5700004 +5700004 1 5700005 +5700005 2 5700002 5700006 +5700006 2 5700006 5700007 +5700007 1 5700008 +5700008 1 5700009 +5700009 0 + +-------------------------------------------- +600000 +600000 1 600001 +600001 2 600000 600002 +600002 0 + +-------------------------------------------- +35500000 +35500000 0 + +-------------------------------------------- +5200000 +5200000 1 5200001 +5200001 0 + +-------------------------------------------- +40100000 +40100000 1 40100000 + +-------------------------------------------- +9800000 +9800000 1 9800000 + +-------------------------------------------- +44700000 +44700000 1 44700000 + +-------------------------------------------- +14400000 +14400000 0 + +-------------------------------------------- +49300000 +49300000 2 49300001 49300003 +49300001 1 49300002 +49300002 2 49300002 49300003 +49300003 2 49300003 49300004 +49300004 2 49300002 49300005 +49300005 1 49300001 + +-------------------------------------------- +19000000 +19000000 1 19000001 +19000001 1 19000002 +19000002 1 19000003 +19000003 1 19000004 +19000004 1 19000005 +19000005 2 19000003 19000006 +19000006 1 19000007 +19000007 1 19000008 +19000008 0 + +-------------------------------------------- +11500000 +11500000 2 11500000 11500001 +11500001 1 11500002 +11500002 1 11500003 +11500003 1 11500001 + +-------------------------------------------- +23600000 +23600000 2 23600000 23600001 +23600001 1 23600002 +23600002 1 23600002 + +-------------------------------------------- +28200000 +28200000 1 28200001 +28200001 1 28200002 +28200002 0 + +-------------------------------------------- +32800000 +32800000 1 32800001 +32800001 0 + +-------------------------------------------- +2500000 +2500000 1 2500001 +2500001 1 2500002 +2500002 1 2500003 +2500003 2 2500001 2500004 +2500004 1 2500000 + +-------------------------------------------- +37400000 +37400000 1 37400000 + +-------------------------------------------- +7100000 +7100000 1 7100001 +7100001 2 7100000 7100002 +7100002 2 7100002 7100003 +7100003 1 7100004 +7100004 1 7100005 +7100005 0 + +-------------------------------------------- +42000000 +42000000 1 42000001 +42000001 1 42000002 +42000002 1 42000003 +42000003 2 42000003 42000004 +42000004 2 42000005 42000007 +42000005 2 42000008 42000006 +42000006 2 42000005 42000007 +42000007 1 42000008 +42000008 1 42000009 +42000009 0 + +-------------------------------------------- +11700000 +11700000 1 11700001 +11700001 0 + +-------------------------------------------- +46400000 +46400000 1 46400001 +46400001 1 46400001 + +-------------------------------------------- +31200000 +31200000 1 31200001 +31200001 1 31200002 +31200002 2 31200000 31200003 +31200003 1 31200004 +31200004 0 + +-------------------------------------------- +16300000 +16300000 2 16300001 16300010 +16300001 1 16300002 +16300002 1 16300003 +16300003 1 16300004 +16300004 2 16300000 16300005 +16300005 2 16300012 16300006 +16300006 1 16300007 +16300007 2 16300008 16300000 +16300008 2 16300009 16300005 +16300009 1 16300010 +16300010 1 16300011 +16300011 1 16300012 +16300012 2 16300000 16300013 +16300013 0 + +-------------------------------------------- +20900000 +20900000 1 20900001 +20900001 1 20900002 +20900002 1 20900003 +20900003 2 20900003 20900004 +20900004 1 20900001 + +-------------------------------------------- +25500000 +25500000 1 25500001 +25500001 2 25500008 25500002 +25500002 1 25500003 +25500003 2 25500000 25500004 +25500004 2 25500002 25500005 +25500005 1 25500006 +25500006 2 25500003 25500007 +25500007 2 25500008 25500004 +25500008 1 25500009 +25500009 2 25500010 25500003 +25500010 1 25500010 + +-------------------------------------------- +30100000 +30100000 2 30100000 30100001 +30100001 1 30100002 +30100002 1 30100003 +30100003 1 30100004 +30100004 1 30100005 +30100005 2 30100005 30100006 +30100006 1 30100007 +30100007 1 30100001 + +-------------------------------------------- +18200000 +18200000 2 18200001 18200002 +18200001 2 18200002 18200003 +18200002 2 18200000 18200003 +18200003 0 + +-------------------------------------------- +22800000 +22800000 2 22800000 22800001 +22800001 1 22800002 +22800002 1 22800001 + +-------------------------------------------- +13800000 +13800000 0 + +-------------------------------------------- +8700000 +8700000 2 8700008 8700001 +8700001 2 8700000 8700002 +8700002 2 8700003 8700013 +8700003 1 8700004 +8700004 1 8700005 +8700005 1 8700006 +8700006 1 8700007 +8700007 1 8700008 +8700008 1 8700009 +8700009 1 8700010 +8700010 1 8700011 +8700011 2 8700012 8700006 +8700012 2 8700002 8700013 +8700013 0 + +-------------------------------------------- +15500000 +15500000 0 + +-------------------------------------------- +48700000 +48700000 2 48700000 48700001 +48700001 2 48700001 48700002 +48700002 1 48700003 +48700003 2 48700001 48700004 +48700004 1 48700005 +48700005 2 48700004 48700006 +48700006 1 48700005 + +-------------------------------------------- +24700000 +24700000 1 24700001 +24700001 2 24700001 24700002 +24700002 1 24700000 + +-------------------------------------------- +32400000 +32400000 1 32400001 +32400001 0 + +-------------------------------------------- +8600000 +8600000 1 8600001 +8600001 1 8600002 +8600002 1 8600003 +8600003 2 8600001 8600004 +8600004 2 8600001 40800000 + +-------------------------------------------- +12800000 +12800000 2 12800000 12800001 +12800001 1 12800002 +12800002 2 12800002 12800003 +12800003 1 12800004 +12800004 1 12800005 +12800005 0 + +-------------------------------------------- +47700000 +47700000 0 + +-------------------------------------------- +22000000 +22000000 2 22000000 22000001 +22000001 2 22000001 22000002 +22000002 0 + +-------------------------------------------- +26600000 +26600000 1 26600001 +26600001 2 26600001 26600002 +26600002 1 26600002 + +-------------------------------------------- +16100000 +16100000 1 16100001 +16100001 2 16100002 15400000 +16100002 1 16100003 +16100003 1 16100004 +16100004 1 16100000 + +-------------------------------------------- +900000 +900000 0 + +-------------------------------------------- +35800000 +35800000 1 35800000 + +-------------------------------------------- +5500000 +5500000 1 5500001 +5500001 1 5500002 +5500002 1 5500003 +5500003 2 5500009 5500004 +5500004 1 5500005 +5500005 2 5500000 5500006 +5500006 1 5500007 +5500007 2 5500008 5500007 +5500008 1 5500009 +5500009 1 5500010 +5500010 1 5500011 +5500011 2 5500012 5500007 +5500012 2 5500003 5500013 +5500013 0 + +-------------------------------------------- +40400000 +40400000 1 40400001 +40400001 2 40400002 40400004 +40400002 2 40400003 40400011 +40400003 2 40400012 40400004 +40400004 2 40400011 40400005 +40400005 1 40400006 +40400006 2 40400011 40400007 +40400007 1 40400008 +40400008 1 40400009 +40400009 2 40400010 40400003 +40400010 1 40400011 +40400011 2 40400000 40400012 +40400012 2 40400009 40400013 +40400013 2 40400013 40400014 +40400014 1 40400008 + +-------------------------------------------- +10100000 +10100000 0 + +-------------------------------------------- +45000000 +45000000 2 45000001 45000004 +45000001 1 45000002 +45000002 1 45000003 +45000003 1 45000004 +45000004 0 + +-------------------------------------------- +49600000 +49600000 2 49600001 49600004 +49600001 1 49600002 +49600002 2 49600001 49600003 +49600003 1 49600004 +49600004 2 49600002 49600005 +49600005 1 49600006 +49600006 1 49600007 +49600007 1 49600008 +49600008 2 49600009 49600003 +49600009 2 49600010 49600003 +49600010 2 49600002 49600011 +49600011 0 + +-------------------------------------------- +31800000 +31800000 1 31800000 + +-------------------------------------------- +14900000 +14900000 1 14900001 +14900001 1 30900000 + +-------------------------------------------- +28500000 +28500000 2 28500001 28500007 +28500001 2 28500009 28500002 +28500002 1 28500003 +28500003 1 28500004 +28500004 1 28500005 +28500005 2 28500001 28500006 +28500006 1 28500007 +28500007 2 28500008 28500007 +28500008 2 28500009 28500006 +28500009 1 28500010 +28500010 1 28500011 +28500011 1 28500012 +28500012 2 28500008 28500013 +28500013 1 28500014 +28500014 1 28500015 +28500015 1 28500004 + +-------------------------------------------- +33100000 +33100000 2 33100000 33100001 +33100001 1 33100002 +33100002 0 + +-------------------------------------------- +2800000 +2800000 2 2800000 2800001 +2800001 2 2800001 2800002 +2800002 1 2800003 +2800003 1 2800002 + +-------------------------------------------- +37700000 +37700000 1 37700001 +37700001 1 37700002 +37700002 2 37700001 37700003 +37700003 1 37700004 +37700004 2 37700003 37700005 +37700005 2 37700001 37700006 +37700006 2 37700002 37700007 +37700007 1 37700008 +37700008 2 37700009 37700002 +37700009 0 + +-------------------------------------------- +7400000 +7400000 1 7400001 +7400001 2 7400002 7400003 +7400002 2 7400002 7400003 +7400003 1 7400004 +7400004 1 7400003 + +-------------------------------------------- +42300000 +42300000 2 42300001 42300002 +42300001 2 42300000 42300002 +42300002 1 42300003 +42300003 1 42300001 + +-------------------------------------------- +12000000 +12000000 2 12000000 12000001 +12000001 1 12000002 +12000002 2 12000001 12000003 +12000003 1 12000004 +12000004 0 + +-------------------------------------------- +46900000 +46900000 0 + +-------------------------------------------- +34700000 +34700000 2 34700000 34700001 +34700001 1 34700001 + +-------------------------------------------- +16600000 +16600000 1 16600001 +16600001 1 16600002 +16600002 2 16600001 16600003 +16600003 1 16600004 +16600004 1 16600005 +16600005 2 16600000 16600006 +16600006 1 16600004 + +-------------------------------------------- +21200000 +21200000 1 21200001 +21200001 1 21200002 +21200002 1 21200003 +21200003 1 21200004 +21200004 1 21200005 +21200005 2 21200001 21200006 +21200006 1 21200007 +21200007 1 21200008 +21200008 1 21200009 +21200009 1 21200010 +21200010 0 + +-------------------------------------------- +25800000 +25800000 1 25800001 +25800001 2 25800000 25800002 +25800002 1 25800003 +25800003 1 25800004 +25800004 1 25800005 +25800005 1 25800006 +25800006 2 25800002 25800007 +25800007 1 25800008 +25800008 1 25800009 +25800009 0 + +-------------------------------------------- +30400000 +30400000 2 30400000 30400001 +30400001 0 + +-------------------------------------------- +100000 +100000 1 100001 +100001 1 100002 +100002 1 100003 +100003 2 100002 100004 +100004 1 100005 +100005 0 + +-------------------------------------------- +35000000 +35000000 1 35000000 + +-------------------------------------------- +18400000 +18400000 2 18400001 18400006 +18400001 1 18400002 +18400002 1 18400003 +18400003 1 18400004 +18400004 1 18400005 +18400005 1 18400006 +18400006 0 + +-------------------------------------------- +18000000 +18000000 1 18000001 +18000001 1 18000000 + +-------------------------------------------- +39600000 +39600000 1 39600001 +39600001 1 39600000 + +-------------------------------------------- +9300000 +9300000 1 9300001 +9300001 1 9300002 +9300002 1 9300003 +9300003 2 9300002 9300004 +9300004 0 + +-------------------------------------------- +44200000 +44200000 2 44200000 44200001 +44200001 0 + +-------------------------------------------- +13900000 +13900000 1 13900001 +13900001 1 13900001 + +-------------------------------------------- +48800000 +48800000 0 + +-------------------------------------------- +18500000 +18500000 2 18500001 18500005 +18500001 2 18500002 18500004 +18500002 2 18500003 18500005 +18500003 1 18500004 +18500004 1 18500005 +18500005 1 18500005 + +-------------------------------------------- +23100000 +23100000 2 23100001 23100003 +23100001 2 23100002 23100004 +23100002 1 23100003 +23100003 2 23100002 23100004 +23100004 1 23100005 +23100005 1 23100006 +23100006 2 23100003 23100007 +23100007 2 23100008 23100006 +23100008 1 23100009 +23100009 2 23100010 23100003 +23100010 0 + +-------------------------------------------- +27700000 +27700000 1 27700001 +27700001 0 + +-------------------------------------------- +34100000 +34100000 1 34100001 +34100001 2 34100000 34100002 +34100002 0 + +-------------------------------------------- +32300000 +32300000 0 + +-------------------------------------------- +2000000 +2000000 1 2000001 +2000001 2 2000001 2000002 +2000002 2 2000003 2000006 +2000003 1 2000004 +2000004 1 2000005 +2000005 2 2000004 2000006 +2000006 0 + +-------------------------------------------- +36900000 +36900000 1 36900001 +36900001 1 36900000 + +-------------------------------------------- +6600000 +6600000 1 6600001 +6600001 1 6600002 +6600002 1 6600001 + +-------------------------------------------- +41500000 +41500000 0 + +-------------------------------------------- +11200000 +11200000 1 11200000 + +-------------------------------------------- +46100000 +46100000 0 + +-------------------------------------------- +15800000 +15800000 0 + +-------------------------------------------- +5000000 +5000000 2 5000001 5000015 +5000001 2 5000001 5000002 +5000002 2 5000000 5000003 +5000003 1 5000004 +5000004 2 5000008 5000005 +5000005 1 5000006 +5000006 1 5000007 +5000007 2 5000008 5000004 +5000008 1 5000009 +5000009 2 5000010 5000018 +5000010 1 5000011 +5000011 2 5000000 5000012 +5000012 1 5000013 +5000013 1 5000014 +5000014 1 5000015 +5000015 2 5000016 5000013 +5000016 1 5000017 +5000017 2 5000016 5000018 +5000018 1 5000009 + +-------------------------------------------- +14700000 +14700000 1 14700001 +14700001 1 14700002 +14700002 0 + +-------------------------------------------- +20400000 +20400000 1 20400001 +20400001 1 20400001 + +-------------------------------------------- +25000000 +25000000 2 25000001 25000003 +25000001 1 25000002 +25000002 1 25000003 +25000003 2 25000001 25000004 +25000004 1 25000002 + +-------------------------------------------- +29600000 +29600000 1 29600001 +29600001 1 29600000 + +-------------------------------------------- +34200000 +34200000 1 34200001 +34200001 1 34200002 +34200002 1 34200003 +34200003 1 34200003 + +-------------------------------------------- +3900000 +3900000 1 3900001 +3900001 1 3900002 +3900002 2 3900002 3900003 +3900003 1 3900000 + +-------------------------------------------- +38800000 +38800000 1 38800001 +38800001 2 38800009 38800002 +38800002 1 38800003 +38800003 2 38800001 38800004 +38800004 2 38800010 38800005 +38800005 1 38800006 +38800006 2 38800006 38800007 +38800007 1 38800008 +38800008 2 38800000 38800009 +38800009 1 38800010 +38800010 0 + +-------------------------------------------- +8500000 +8500000 1 8500001 +8500001 2 8500001 8500002 +8500002 1 8500000 + +-------------------------------------------- +20700000 +20700000 1 20700001 +20700001 2 20700000 20700002 +20700002 1 20700003 +20700003 1 20700001 + +-------------------------------------------- +13100000 +13100000 1 13100001 +13100001 2 13100001 13100002 +13100002 1 13100003 +13100003 0 + +-------------------------------------------- +48000000 +48000000 1 48000001 +48000001 1 48000001 + +-------------------------------------------- +17700000 +17700000 0 + +-------------------------------------------- +22300000 +22300000 0 + +-------------------------------------------- +26900000 +26900000 2 26900000 26900001 +26900001 2 26900000 26900002 +26900002 0 + +-------------------------------------------- +31500000 +31500000 2 31500001 31500004 +31500001 1 31500002 +31500002 2 31500003 31500006 +31500003 2 31500001 31500004 +31500004 1 31500005 +31500005 2 31500000 31500006 +31500006 0 + +-------------------------------------------- +4400000 +4400000 2 4400000 4400001 +4400001 2 4400002 29100000 +4400002 0 + +-------------------------------------------- +37000000 +37000000 1 37000000 + +-------------------------------------------- +1200000 +1200000 2 1200000 1200001 +1200001 1 1200002 +1200002 1 1200003 +1200003 1 1200004 +1200004 1 1200005 +1200005 1 1200001 + +-------------------------------------------- +36100000 +36100000 1 36100001 +36100001 1 36100002 +36100002 1 36100003 +36100003 1 36100004 +36100004 1 36100005 +36100005 2 36100003 36100006 +36100006 1 36100007 +36100007 0 + +-------------------------------------------- +5800000 +5800000 1 5800000 + +-------------------------------------------- +40700000 +40700000 1 40700001 +40700001 1 40700002 +40700002 1 40700003 +40700003 2 40700000 40700004 +40700004 1 40700000 + +-------------------------------------------- +10400000 +10400000 1 10400001 +10400001 1 10400002 +10400002 1 10400003 +10400003 2 10400004 10400015 +10400004 1 10400005 +10400005 1 10400006 +10400006 2 10400005 10400007 +10400007 1 10400008 +10400008 1 10400009 +10400009 1 10400010 +10400010 1 10400011 +10400011 2 10400003 10400012 +10400012 2 10400003 10400013 +10400013 1 10400014 +10400014 2 10400000 10400015 +10400015 1 10400016 +10400016 1 10400017 +10400017 2 10400018 10400004 +10400018 0 + +-------------------------------------------- +45300000 +45300000 2 45300001 45300004 +45300001 1 45300002 +45300002 1 45300003 +45300003 2 45300003 45300004 +45300004 2 45300017 45300005 +45300005 2 45300003 45300006 +45300006 2 45300002 45300007 +45300007 2 45300008 45300005 +45300008 2 45300009 45300001 +45300009 2 45300001 45300010 +45300010 2 45300008 45300011 +45300011 1 45300012 +45300012 2 45300001 45300013 +45300013 1 45300014 +45300014 2 45300002 45300015 +45300015 1 45300016 +45300016 2 45300017 45300003 +45300017 1 45300018 +45300018 1 45300003 + +-------------------------------------------- +15000000 +15000000 1 15000001 +15000001 1 15000002 +15000002 0 + +-------------------------------------------- +49900000 +49900000 1 49900001 +49900001 1 49900000 + +-------------------------------------------- +49500000 +49500000 1 49500001 +49500001 0 + +-------------------------------------------- +19600000 +19600000 1 19600001 +19600001 1 19600002 +19600002 1 19600003 +19600003 1 19600004 +19600004 1 19600005 +19600005 2 19600001 19600006 +19600006 2 19600002 19600007 +19600007 2 19600008 19600012 +19600008 1 19600009 +19600009 2 19600010 19600013 +19600010 1 19600011 +19600011 1 19600012 +19600012 1 19600013 +19600013 0 + +-------------------------------------------- +30300000 +30300000 1 30300001 +30300001 1 30300000 + +-------------------------------------------- +11100000 +11100000 1 11100000 + +-------------------------------------------- +39300000 +39300000 1 39300001 +39300001 1 39300002 +39300002 2 39300001 39300003 +39300003 1 39300004 +39300004 1 39300005 +39300005 2 39300003 39300006 +39300006 2 39300004 39300007 +39300007 1 39300008 +39300008 1 39300009 +39300009 1 39300010 +39300010 1 39300011 +39300011 2 39300008 39300012 +39300012 1 39300013 +39300013 1 39300014 +39300014 0 + +-------------------------------------------- +28800000 +28800000 1 28800001 +28800001 0 + +-------------------------------------------- +33400000 +33400000 2 33400008 33400001 +33400001 1 33400002 +33400002 1 33400003 +33400003 2 33400008 33400004 +33400004 1 33400005 +33400005 2 33400003 33400006 +33400006 1 33400007 +33400007 1 33400008 +33400008 0 + +-------------------------------------------- +3100000 +3100000 2 3100001 34600000 +3100001 2 3100000 3100002 +3100002 1 3100000 + +-------------------------------------------- +38000000 +38000000 1 38000001 +38000001 1 38000002 +38000002 1 38000003 +38000003 1 38000004 +38000004 1 38000005 +38000005 1 38000006 +38000006 1 38000007 +38000007 1 38000003 + +-------------------------------------------- +7700000 +7700000 2 7700000 7700001 +7700001 1 7700002 +7700002 2 7700000 7700003 +7700003 0 + +-------------------------------------------- +42600000 +42600000 2 42600008 42600001 +42600001 1 42600002 +42600002 2 42600000 42600003 +42600003 1 42600004 +42600004 1 42600005 +42600005 2 42600001 42600006 +42600006 2 42600005 42600007 +42600007 1 42600008 +42600008 2 42600000 42600009 +42600009 1 42600009 + +-------------------------------------------- +12300000 +12300000 0 + +-------------------------------------------- +47200000 +47200000 2 47200000 47200001 +47200001 1 47200002 +47200002 1 47200003 +47200003 1 47200004 +47200004 2 47200000 47200005 +47200005 1 47200006 +47200006 1 47200007 +47200007 2 47200008 47200000 +47200008 0 + +-------------------------------------------- +23000000 +23000000 2 23000000 23000001 +23000001 2 23000001 23000002 +23000002 2 23000001 23000003 +23000003 1 23000004 +23000004 2 23000000 23000005 +23000005 0 + +-------------------------------------------- +43300000 +43300000 1 43300001 +43300001 1 43300001 + +-------------------------------------------- +16900000 +16900000 1 16900001 +16900001 1 16900002 +16900002 2 16900001 16900003 +16900003 1 16900004 +16900004 2 16900003 16900005 +16900005 1 16900006 +16900006 2 16900004 16900007 +16900007 1 16900003 + +-------------------------------------------- +27400000 +27400000 2 27400000 27400001 +27400001 1 27400002 +27400002 0 + +-------------------------------------------- +17800000 +17800000 1 17800000 + +-------------------------------------------- +8200000 +8200000 1 8200001 +8200001 1 8200002 +8200002 1 8200003 +8200003 1 8200003 + +-------------------------------------------- +21500000 +21500000 0 + +-------------------------------------------- +26100000 +26100000 1 26100001 +26100001 1 26100002 +26100002 2 26100000 26100003 +26100003 1 26100004 +26100004 1 26100005 +26100005 1 26100006 +26100006 1 26100007 +26100007 1 26100008 +26100008 1 26100009 +26100009 1 26100010 +26100010 1 26100005 + +-------------------------------------------- +30700000 +30700000 2 30700000 30700001 +30700001 2 30700000 30700002 +30700002 1 30700003 +30700003 1 30700004 +30700004 2 30700000 30700005 +30700005 1 30700006 +30700006 1 30700003 + +-------------------------------------------- +400000 +400000 1 400001 +400001 2 400000 400002 +400002 1 400003 +400003 1 400004 +400004 0 + +-------------------------------------------- +35300000 +35300000 1 35300001 +35300001 1 35300002 +35300002 1 35300000 + +-------------------------------------------- +38700000 +38700000 1 38700001 +38700001 2 38700001 38700002 +38700002 2 38700003 38700004 +38700003 1 38700004 +38700004 1 38700005 +38700005 0 + +-------------------------------------------- +39900000 +39900000 2 39900000 39900001 +39900001 1 39900002 +39900002 1 39900003 +39900003 2 39900004 39900007 +39900004 1 39900005 +39900005 1 39900006 +39900006 1 39900007 +39900007 2 39900008 39900006 +39900008 1 39900008 + +-------------------------------------------- +9600000 +9600000 0 + +-------------------------------------------- +44500000 +44500000 1 44500001 +44500001 1 44500002 +44500002 1 44500003 +44500003 2 44500003 44500004 +44500004 1 44500005 +44500005 1 44500006 +44500006 1 44500007 +44500007 2 44500008 44500011 +44500008 1 44500009 +44500009 1 44500010 +44500010 1 44500011 +44500011 1 44500012 +44500012 1 44500002 + +-------------------------------------------- +14200000 +14200000 2 14200000 14200001 +14200001 1 14200002 +14200002 2 14200001 14200003 +14200003 1 14200004 +14200004 1 14200005 +14200005 2 14200005 14200006 +14200006 1 14200007 +14200007 0 + +-------------------------------------------- +49100000 +49100000 1 49100001 +49100001 1 49100002 +49100002 2 49100000 49100003 +49100003 1 49100004 +49100004 2 49100001 49100005 +49100005 1 49100003 + +-------------------------------------------- +18800000 +18800000 1 18800000 + +-------------------------------------------- +23400000 +23400000 1 23400001 +23400001 1 23400002 +23400002 0 + +-------------------------------------------- +28000000 +28000000 2 28000001 28000002 +28000001 2 28000000 28000002 +28000002 1 28000000 + +-------------------------------------------- +22400000 +22400000 2 22400000 22400001 +22400001 1 22400000 + +-------------------------------------------- +27200000 +27200000 2 27200000 27200001 +27200001 0 + +-------------------------------------------- +32600000 +32600000 2 32600000 32600001 +32600001 2 32600002 32600003 +32600002 1 32600003 +32600003 2 32600003 32600004 +32600004 1 32600005 +32600005 1 32600002 + +-------------------------------------------- +31700000 +31700000 0 + +-------------------------------------------- +4200000 +4200000 2 4200000 4200001 +4200001 1 4200000 + +-------------------------------------------- +8800000 +8800000 1 8800001 +8800001 2 8800002 8800005 +8800002 2 8800002 8800003 +8800003 1 8800004 +8800004 2 8800002 8800005 +8800005 1 8800002 + +-------------------------------------------- +9000000 +9000000 1 7000000 + +-------------------------------------------- +1500000 +1500000 1 1500001 +1500001 1 1500002 +1500002 1 1500003 +1500003 1 1500004 +1500004 0 + +-------------------------------------------- +13400000 +13400000 1 13400001 +13400001 1 13400001 + +-------------------------------------------- +43900000 +43900000 1 43900001 +43900001 2 43900001 43900002 +43900002 1 43900003 +43900003 1 43900004 +43900004 1 43900005 +43900005 2 43900006 43900007 +43900006 1 43900007 +43900007 1 43900008 +43900008 2 43900009 43900007 +43900009 1 43900010 +43900010 1 43900011 +43900011 1 43900012 +43900012 2 43900013 43900007 +43900013 2 43900009 43900014 +43900014 2 43900012 43900015 +43900015 1 43900016 +43900016 1 43900017 +43900017 2 43900018 43900013 +43900018 2 43900019 43900007 +43900019 1 43900020 +43900020 0 + +-------------------------------------------- +6100000 +6100000 2 6100000 6100001 +6100001 1 6100002 +6100002 2 6100001 6100003 +6100003 2 6100009 6100004 +6100004 2 6100001 6100005 +6100005 2 6100010 6100006 +6100006 2 6100005 6100007 +6100007 1 6100008 +6100008 1 6100009 +6100009 1 6100010 +6100010 1 6100002 + +-------------------------------------------- +41000000 +41000000 2 41000001 41000011 +41000001 1 41000002 +41000002 1 41000003 +41000003 1 41000004 +41000004 2 41000004 41000005 +41000005 2 41000006 41000007 +41000006 1 41000007 +41000007 1 41000008 +41000008 1 41000009 +41000009 1 41000010 +41000010 2 41000008 41000011 +41000011 0 + +-------------------------------------------- +15300000 +15300000 2 15300000 15300001 +15300001 1 15300002 +15300002 1 15300003 +15300003 2 15300004 15300006 +15300004 1 15300005 +15300005 2 15300005 15300006 +15300006 2 15300002 15300007 +15300007 0 + +-------------------------------------------- +19900000 +19900000 2 19900000 19900001 +19900001 1 19900000 + +-------------------------------------------- +24500000 +24500000 0 + +-------------------------------------------- +27600000 +27600000 1 27600000 + +-------------------------------------------- +17400000 +17400000 1 17400001 +17400001 1 17400001 + +-------------------------------------------- +29100000 +29100000 1 29100000 + +-------------------------------------------- +33700000 +33700000 1 33700001 +33700001 0 + +-------------------------------------------- +3400000 +3400000 1 3400001 +3400001 1 3400002 +3400002 1 3400003 +3400003 2 3400003 3400004 +3400004 1 3400005 +3400005 0 + +-------------------------------------------- +38300000 +38300000 0 + +-------------------------------------------- +8000000 +8000000 1 8000000 + +-------------------------------------------- +42900000 +42900000 1 42900001 +42900001 1 42900002 +42900002 1 42900003 +42900003 1 42900004 +42900004 2 42900002 42900005 +42900005 0 + +-------------------------------------------- +47500000 +47500000 1 47500001 +47500001 0 + +-------------------------------------------- +11300000 +11300000 2 11300001 11300004 +11300001 1 11300002 +11300002 2 11300003 11300004 +11300003 1 11300004 +11300004 1 11300005 +11300005 1 11300006 +11300006 2 11300003 11300007 +11300007 2 11300008 11300000 +11300008 0 + +-------------------------------------------- +17200000 +17200000 1 17200001 +17200001 1 17200000 + +-------------------------------------------- +21800000 +21800000 2 21800000 21800001 +21800001 1 1300000 + +-------------------------------------------- +26400000 +26400000 1 26400001 +26400001 1 26400002 +26400002 1 26400003 +26400003 2 26400000 26400004 +26400004 1 26400005 +26400005 1 26400006 +26400006 1 26400002 + +-------------------------------------------- +700000 +700000 2 700001 700004 +700001 1 700002 +700002 1 700003 +700003 2 700001 700004 +700004 1 700005 +700005 2 700001 700006 +700006 1 700007 +700007 0 + +-------------------------------------------- +35600000 +35600000 1 35600001 +35600001 1 35600002 +35600002 1 35600003 +35600003 1 35600002 + +-------------------------------------------- +5300000 +5300000 1 5300001 +5300001 1 5300001 + +-------------------------------------------- +27000000 +27000000 2 27000001 27000005 +27000001 1 27000002 +27000002 1 27000003 +27000003 2 27000002 27000004 +27000004 2 27000002 27000005 +27000005 1 27000001 + +-------------------------------------------- +10900000 +10900000 1 10900000 + +-------------------------------------------- +44800000 +44800000 1 44800000 + +-------------------------------------------- +14500000 +14500000 1 14500001 +14500001 1 14500002 +14500002 0 + +-------------------------------------------- +49400000 +49400000 0 + +-------------------------------------------- +19100000 +19100000 1 19100001 +19100001 1 19100002 +19100002 1 19100003 +19100003 1 19100003 + +-------------------------------------------- +23700000 +23700000 1 23700001 +23700001 1 23700002 +23700002 0 + +-------------------------------------------- +28300000 +28300000 1 28300001 +28300001 1 28300002 +28300002 2 28300001 28300003 +28300003 1 28300004 +28300004 1 28300005 +28300005 2 28300005 28300006 +28300006 1 28300007 +28300007 1 28300008 +28300008 2 28300000 28300009 +28300009 1 28300010 +28300010 1 28300011 +28300011 1 28300012 +28300012 2 28300013 28300006 +28300013 0 + +-------------------------------------------- +29900000 +29900000 1 29900001 +29900001 1 29900002 +29900002 0 + +-------------------------------------------- +32900000 +32900000 2 32900001 32900002 +32900001 2 32900000 32900002 +32900002 0 + +-------------------------------------------- +2600000 +2600000 0 + +-------------------------------------------- +37500000 +37500000 1 37500001 +37500001 1 37500002 +37500002 2 37500000 37500003 +37500003 2 37500001 37500004 +37500004 1 37500005 +37500005 1 37500006 +37500006 1 37500007 +37500007 2 37500008 37500006 +37500008 1 37500009 +37500009 0 + +-------------------------------------------- +7200000 +7200000 1 7200001 +7200001 1 7200002 +7200002 2 7200002 7200003 +7200003 1 7200004 +7200004 2 7200003 7200005 +7200005 1 7200006 +7200006 2 7200001 7200007 +7200007 2 7200008 7200006 +7200008 1 7200009 +7200009 2 7200010 7200006 +7200010 2 7200011 7200004 +7200011 2 7200009 7200012 +7200012 2 7200009 7200013 +7200013 2 7200003 7200014 +7200014 1 7200015 +7200015 1 7200016 +7200016 1 7200017 +7200017 2 7200017 7200018 +7200018 2 7200019 7200006 +7200019 2 7200003 7200020 +7200020 1 7200021 +7200021 2 7200008 7200022 +7200022 0 + +-------------------------------------------- +42100000 +42100000 2 42100001 42100004 +42100001 1 42100002 +42100002 1 42100003 +42100003 1 42100004 +42100004 0 + +-------------------------------------------- +11800000 +11800000 2 11800000 11800001 +11800001 1 11800002 +11800002 1 11800003 +11800003 2 11800004 11800006 +11800004 1 11800005 +11800005 1 11800006 +11800006 1 11800007 +11800007 2 11800008 11800002 +11800008 0 + +-------------------------------------------- +46700000 +46700000 1 46700001 +46700001 2 46700000 46700002 +46700002 1 46700003 +46700003 2 46700003 46700004 +46700004 1 46700005 +46700005 1 46700003 + +-------------------------------------------- +16400000 +16400000 1 16400000 + +-------------------------------------------- +13600000 +13600000 2 13600008 13600001 +13600001 2 13600001 13600002 +13600002 2 13600002 13600003 +13600003 1 13600004 +13600004 2 13600004 13600005 +13600005 2 13600004 13600006 +13600006 1 13600007 +13600007 1 13600008 +13600008 2 13600009 13600002 +13600009 2 13600010 13600004 +13600010 1 13600011 +13600011 1 13600003 + +-------------------------------------------- +36400000 +36400000 2 36400001 36400003 +36400001 1 36400002 +36400002 2 36400002 36400003 +36400003 1 36400004 +36400004 1 36400005 +36400005 1 36400006 +36400006 1 36400007 +36400007 1 36400008 +36400008 1 36400001 + +-------------------------------------------- +25600000 +25600000 2 25600001 25600002 +25600001 1 25600002 +25600002 2 25600001 25600003 +25600003 1 25600004 +25600004 0 + +-------------------------------------------- +30200000 +30200000 1 30200001 +30200001 1 30200002 +30200002 2 30200002 30200003 +30200003 1 30200004 +30200004 1 30200005 +30200005 2 30200003 30200006 +30200006 1 30200007 +30200007 1 30200008 +30200008 2 30200009 30200005 +30200009 2 30200001 30200010 +30200010 2 30200010 30200011 +30200011 1 30200005 + +-------------------------------------------- +34800000 +34800000 1 34800001 +34800001 1 34800002 +34800002 1 34800000 + +-------------------------------------------- +4500000 +4500000 1 4500001 +4500001 0 + +-------------------------------------------- +39400000 +39400000 0 + +-------------------------------------------- +44000000 +44000000 1 44000001 +44000001 2 44000001 44000002 +44000002 1 44000002 + +-------------------------------------------- +48500000 +48500000 2 48500000 48500001 +48500001 1 48500002 +48500002 0 + +-------------------------------------------- +13700000 +13700000 1 13700001 +13700001 0 + +-------------------------------------------- +48600000 +48600000 1 48600001 +48600001 1 48600002 +48600002 1 48600003 +48600003 0 + +-------------------------------------------- +18300000 +18300000 1 18300001 +18300001 1 18300002 +18300002 1 18300003 +18300003 1 18300003 + +-------------------------------------------- +22900000 +22900000 2 22900000 22900001 +22900001 2 22900001 22900002 +22900002 1 22900002 + +-------------------------------------------- +27500000 +27500000 2 27500000 27500001 +27500001 0 + +-------------------------------------------- +32100000 +32100000 1 32100001 +32100001 1 32100002 +32100002 2 32100002 32100003 +32100003 2 32100001 32100004 +32100004 1 32100005 +32100005 2 32100003 32100006 +32100006 1 32100007 +32100007 2 32100008 32100002 +32100008 2 32100008 32100009 +32100009 1 32100010 +32100010 0 + +-------------------------------------------- +32200000 +32200000 2 32200000 32200001 +32200001 1 32200002 +32200002 1 32200003 +32200003 0 + +-------------------------------------------- +10700000 +10700000 2 10700000 10700001 +10700001 2 10700001 10700002 +10700002 2 10700003 10700004 +10700003 1 10700004 +10700004 1 10700005 +10700005 1 10700006 +10700006 2 10700001 10700007 +10700007 2 10700008 10700003 +10700008 2 10700009 10700005 +10700009 1 10700010 +10700010 1 10700011 +10700011 0 + +-------------------------------------------- +6400000 +6400000 1 6400001 +6400001 1 6400002 +6400002 2 6400003 6400006 +6400003 2 6400004 6400007 +6400004 1 6400005 +6400005 1 6400006 +6400006 1 6400007 +6400007 0 + +-------------------------------------------- +41300000 +41300000 1 41300001 +41300001 1 41300002 +41300002 1 41300002 + +-------------------------------------------- +11000000 +11000000 2 11000000 11000001 +11000001 2 11000000 11000002 +11000002 2 11000002 11000003 +11000003 0 + +-------------------------------------------- +45900000 +45900000 1 45900001 +45900001 1 45900002 +45900002 1 45900001 + +-------------------------------------------- +15600000 +15600000 1 15600001 +15600001 0 + +-------------------------------------------- +20200000 +20200000 2 20200001 31600000 +20200001 0 + +-------------------------------------------- +24800000 +24800000 1 24800001 +24800001 0 + +-------------------------------------------- +15900000 +15900000 2 15900000 15900001 +15900001 0 + +-------------------------------------------- +29400000 +29400064 2 29400065 29400001 +29400065 2 29400066 29400019 +29400066 2 29400067 29400051 +29400067 2 29400068 29400063 +29400068 2 29400069 10000000 +29400069 2 29400070 1500000 +29400070 2 29400071 46000000 +29400071 2 29400072 29400036 +29400072 2 29400073 43700000 +29400073 2 29400074 35000000 +29400074 2 29400075 29400011 +29400075 2 29400035 29400076 +29400076 2 29400077 27300000 +29400077 2 29400078 41700000 +29400078 1 29400079 +29400079 2 29400080 36800000 +29400080 2 29400081 13500000 +29400081 2 29400082 29400141 +29400082 2 29400083 23000000 +29400083 2 29400065 29400084 +29400084 2 29400085 29400087 +29400085 2 29400086 30500000 +29400086 2 29400087 36200000 +29400087 2 29400088 29400126 +29400088 2 29400089 29400041 +29400089 2 29400090 29400047 +29400090 2 29400091 5400000 +29400091 2 29400107 29400092 +29400092 2 29400093 29400095 +29400093 2 29400025 29400094 +29400094 2 29400000 29400095 +29400095 2 29400096 29400070 +29400096 2 29400097 4900000 +29400097 2 29400098 29400092 +29400098 2 29400099 18400000 +29400099 2 29400073 29400100 +29400100 2 29400101 29400069 +29400101 2 29400032 29400102 +29400102 2 29400103 21600000 +29400103 2 29400104 12600000 +29400104 2 29400104 29400105 +29400105 2 29400106 10700000 +29400106 2 29400107 29400046 +29400107 2 29400001 29400108 +29400108 2 29400109 37100000 +29400109 2 29400057 29400110 +29400110 2 29400111 34200000 +29400111 2 29400112 46700000 +29400112 2 29400113 10500000 +29400113 2 29400114 15100000 +29400114 2 29400115 30200000 +29400115 2 29400116 29400030 +29400116 2 29400117 31500000 +29400117 2 29400016 29400118 +29400118 2 29400061 29400119 +29400119 2 29400120 37500000 +29400120 2 29400121 29400098 +29400121 2 29400122 40800000 +29400122 2 29400123 24000000 +29400123 2 29400112 29400124 +29400124 2 29400125 29400086 +29400125 2 29400126 46900000 +29400126 2 29400127 9100000 +29400127 2 29400128 28400000 +29400128 2 29400129 4600000 +29400129 2 29400130 29400125 +29400130 2 29400131 600000 +29400131 2 29400132 18800000 +29400132 2 29400133 17000000 +29400133 2 29400134 29400047 +29400134 2 29400135 13200000 +29400135 2 29400136 29100000 +29400136 2 29400137 6200000 +29400137 2 29400138 29400010 +29400138 2 29400139 10400000 +29400139 2 29400056 29400140 +29400140 2 29400027 29400141 +29400141 2 29400142 22300000 +29400142 2 29400032 29400143 +29400143 2 29400144 49800000 +29400144 2 29400145 48400000 +29400145 2 29400146 49300000 +29400146 2 29400139 26600000 +29400000 2 29400001 35900000 +29400001 2 29400002 48500000 +29400002 2 29400003 29400035 +29400003 2 29400003 29400004 +29400004 2 29400005 36300000 +29400005 2 29400123 29400006 +29400006 2 29400007 32400000 +29400007 2 29400008 29400042 +29400008 2 29400009 29400006 +29400009 2 29400010 45900000 +29400010 2 29400010 29400011 +29400011 2 29400012 2100000 +29400012 2 29400013 17100000 +29400013 2 29400130 29400014 +29400014 2 29400113 29400015 +29400015 2 29400016 7800000 +29400016 2 29400017 22700000 +29400017 2 29400018 34100000 +29400018 2 29400019 43600000 +29400019 2 29400020 29400014 +29400020 2 29400021 44400000 +29400021 2 29400022 29400087 +29400022 2 29400132 29400023 +29400023 2 29400024 37300000 +29400024 2 29400025 28300000 +29400025 2 29400026 29400021 +29400026 2 29400027 900000 +29400027 2 29400028 29400006 +29400028 2 29400029 29400071 +29400029 2 29400030 40900000 +29400030 2 29400031 17800000 +29400031 2 29400032 2900000 +29400032 2 29400033 21500000 +29400033 2 29400034 29400011 +29400034 2 29400035 29400007 +29400035 2 29400034 29400036 +29400036 2 29400081 29400037 +29400037 2 29400038 45600000 +29400038 2 29400010 29400039 +29400039 2 29400040 29400020 +29400040 2 29400041 29400028 +29400041 2 29400042 29400004 +29400042 2 29400064 29400043 +29400043 2 29400084 29400044 +29400044 2 29400045 29400085 +29400045 2 29400026 29400046 +29400046 2 29400047 2200000 +29400047 2 29400048 29400006 +29400048 2 29400049 35300000 +29400049 2 29400050 47200000 +29400050 2 29400064 29400051 +29400051 2 29400052 9000000 +29400052 2 29400053 29400005 +29400053 2 29400054 5900000 +29400054 2 29400031 29400055 +29400055 2 29400056 33800000 +29400056 2 29400057 29400132 +29400057 2 29400129 29400058 +29400058 2 29400080 29400059 +29400059 2 29400060 34300000 +29400060 2 29400010 29400061 +29400061 2 29400099 29400062 +29400062 2 29400063 30900000 +29400063 2 29400064 14900000 + +-------------------------------------------- +34000000 +34000000 0 + +-------------------------------------------- +3700000 +3700000 1 3700001 +3700001 2 3700002 3700007 +3700002 2 3700002 3700003 +3700003 1 3700004 +3700004 1 3700005 +3700005 1 3700006 +3700006 2 3700003 3700007 +3700007 2 3700008 3700006 +3700008 2 3700009 3700005 +3700009 1 3700009 + +-------------------------------------------- +38600000 +38600000 2 38600000 38600001 +38600001 1 38600002 +38600002 1 38600003 +38600003 0 + +-------------------------------------------- +8300000 +8300000 2 8300001 8300004 +8300001 1 8300002 +8300002 1 8300003 +8300003 1 8300004 +8300004 0 + +-------------------------------------------- +43200000 +43200000 2 43200001 43200002 +43200001 2 43200000 43200002 +43200002 0 + +-------------------------------------------- +12900000 +12900000 2 12900001 47100000 +12900001 2 12900002 15000000 +12900002 2 12900003 40700000 +12900003 2 12900004 14400000 +12900004 2 12900005 20500000 +12900005 2 12900006 48100000 +12900006 2 12900007 18500000 +12900007 2 12900008 44700000 +12900008 2 12900009 12900002 +12900009 2 12900010 23900000 +12900010 2 12900011 3900000 +12900011 2 12900012 39100000 +12900012 2 12900013 30000000 +12900013 2 12900014 3300000 +12900014 2 12900012 12900015 +12900015 2 12900016 12900003 +12900016 2 12900017 46200000 +12900017 2 12900018 5200000 +12900018 2 12900200 12900019 +12900019 2 12900020 12900005 +12900020 2 12900021 18000000 +12900021 2 12900014 12900022 +12900022 2 12900019 12900023 +12900023 2 12900024 12900228 +12900024 2 12900025 15700000 +12900025 2 12900026 12900003 +12900026 2 12900027 21300000 +12900027 2 12900028 20300000 +12900028 2 12900322 12900029 +12900029 2 12900018 12900030 +12900030 2 12900031 43400000 +12900031 2 12900032 12900190 +12900032 2 12900033 15900000 +12900033 2 12900034 12900018 +12900034 2 12900035 12900246 +12900035 2 12900036 24800000 +12900036 2 12900256 12900037 +12900037 2 12900038 18200000 +12900038 2 12900131 12900039 +12900039 2 12900040 12900039 +12900040 2 12900041 26100000 +12900041 2 12900042 12900027 +12900042 2 12900043 12900275 +12900043 2 12900034 12900044 +12900044 2 12900045 31400000 +12900045 2 12900046 44500000 +12900046 2 12900145 12900047 +12900047 2 12900048 49500000 +12900048 2 12900048 12900049 +12900049 2 12900050 18900000 +12900050 2 12900051 12900045 +12900051 2 12900052 23100000 +12900052 2 12900053 49100000 +12900053 2 12900035 12900054 +12900054 2 12900315 12900055 +12900055 2 12900056 100000 +12900056 2 12900057 12900053 +12900057 2 12900058 6400000 +12900058 2 12900059 12900027 +12900059 2 12900000 12900060 +12900060 2 12900177 12900061 +12900061 2 12900062 12900135 +12900062 2 12900063 9700000 +12900063 2 12900064 12900041 +12900064 2 12900065 45300000 +12900065 2 12900066 12900005 +12900066 2 12900067 11700000 +12900067 2 12900000 12900068 +12900068 2 12900069 21200000 +12900069 2 12900070 16100000 +12900070 2 12900007 12900071 +12900071 2 12900072 20200000 +12900072 2 12900073 21100000 +12900073 2 12900074 12900019 +12900074 2 12900075 12900046 +12900075 2 12900036 12900076 +12900076 2 12900077 12900061 +12900077 2 12900078 26400000 +12900078 2 12900254 12900079 +12900079 2 12900080 12900016 +12900080 2 12900081 12900075 +12900081 2 12900082 12900002 +12900082 2 12900082 12900083 +12900083 2 12900018 12900084 +12900084 2 12900085 33600000 +12900085 2 12900086 16700000 +12900086 2 12900087 26200000 +12900087 2 12900088 12900300 +12900088 2 12900089 3200000 +12900089 2 12900090 22200000 +12900090 2 12900091 7400000 +12900091 2 12900092 400000 +12900092 2 12900093 2400000 +12900093 2 12900094 24600000 +12900094 2 12900095 15600000 +12900095 2 12900096 39300000 +12900096 2 12900097 12900068 +12900097 2 12900098 34000000 +12900098 2 12900217 12900099 +12900099 2 12900100 14300000 +12900100 2 12900101 31900000 +12900101 2 12900102 1200000 +12900102 2 12900103 11300000 +12900103 2 12900104 8400000 +12900104 2 12900105 12900257 +12900105 2 12900106 19700000 +12900106 2 12900107 12900075 +12900107 2 12900267 12900108 +12900108 2 12900109 1800000 +12900109 2 12900004 12900110 +12900110 2 12900245 12900111 +12900111 2 12900112 30100000 +12900112 2 12900000 12900113 +12900113 2 12900114 5700000 +12900114 2 12900115 13400000 +12900115 2 12900116 12900326 +12900116 2 12900088 12900117 +12900117 2 12900118 15800000 +12900118 2 12900233 12900119 +12900119 2 12900120 33100000 +12900120 2 12900121 32100000 +12900121 2 12900122 12900270 +12900122 2 12900123 34600000 +12900123 2 12900124 31300000 +12900124 2 12900125 12900045 +12900125 2 12900118 12900126 +12900126 2 12900076 12900127 +12900127 2 12900128 33500000 +12900128 2 12900129 12900169 +12900129 2 12900130 14000000 +12900130 2 12900131 24400000 +12900131 2 12900060 12900132 +12900132 2 12900133 19100000 +12900133 2 12900134 35600000 +12900134 2 12900135 700000 +12900135 1 12900136 +12900136 2 12900137 19400000 +12900137 2 12900138 42400000 +12900138 2 12900139 43800000 +12900139 2 12900153 12900140 +12900140 2 12900141 12900245 +12900141 2 12900142 12900191 +12900142 2 12900143 35100000 +12900143 2 12900144 48300000 +12900144 2 12900336 12900145 +12900145 2 12900146 27100000 +12900146 2 12900147 12900038 +12900147 2 12900176 12900148 +12900148 2 12900149 27500000 +12900149 2 12900121 12900150 +12900150 2 12900089 12900151 +12900151 2 12900152 12900086 +12900152 2 12900153 12900189 +12900153 2 12900154 36000000 +12900154 2 12900155 36900000 +12900155 2 12900156 12900029 +12900156 2 12900157 41400000 +12900157 2 12900158 41600000 +12900158 2 12900108 12900159 +12900159 2 12900160 12900113 +12900160 2 12900161 17700000 +12900161 2 12900162 16900000 +12900162 2 12900163 12900067 +12900163 2 12900128 12900164 +12900164 2 12900232 12900165 +12900165 2 12900029 12900166 +12900166 2 12900167 25900000 +12900167 2 12900168 12900048 +12900168 2 12900169 2000000 +12900169 2 12900016 12900170 +12900170 2 12900171 21900000 +12900171 2 12900153 12900172 +12900172 2 12900173 33700000 +12900173 2 12900174 42300000 +12900174 2 12900178 12900175 +12900175 2 12900176 12900191 +12900176 2 12900177 12900130 +12900177 2 12900178 12900132 +12900178 2 12900106 12900179 +12900179 2 12900180 29200000 +12900180 2 12900181 35400000 +12900181 2 12900041 12900182 +12900182 2 12900227 12900183 +12900183 2 12900184 12900109 +12900184 2 12900185 12900300 +12900185 2 12900186 9200000 +12900186 2 12900187 12900023 +12900187 2 12900188 26700000 +12900188 2 12900189 30600000 +12900189 2 12900064 12900190 +12900190 2 12900177 12900191 +12900191 2 12900192 35800000 +12900192 2 12900080 12900193 +12900193 2 12900194 17900000 +12900194 2 12900105 12900195 +12900195 2 12900196 12900062 +12900196 2 12900197 12900142 +12900197 2 12900198 41100000 +12900198 2 12900199 13100000 +12900199 2 12900200 12900185 +12900200 2 12900104 12900201 +12900201 2 12900202 27600000 +12900202 2 12900203 38900000 +12900203 2 12900204 36700000 +12900204 2 12900180 12900205 +12900205 2 12900206 12900311 +12900206 2 12900028 12900207 +12900207 2 12900208 12900010 +12900208 2 12900209 12900186 +12900209 2 12900210 31800000 +12900210 2 12900211 26300000 +12900211 2 12900212 29700000 +12900212 2 12900213 11600000 +12900213 2 12900214 300000 +12900214 2 12900215 4400000 +12900215 2 12900216 34800000 +12900216 2 12900217 22000000 +12900217 2 12900218 37200000 +12900218 2 12900219 18300000 +12900219 2 12900220 12900069 +12900220 2 12900221 12900222 +12900221 2 12900222 16600000 +12900222 2 12900223 3700000 +12900223 2 12900224 47600000 +12900224 2 12900225 17200000 +12900225 2 12900226 12900038 +12900226 2 12900227 12900207 +12900227 2 12900228 26500000 +12900228 2 12900229 12500000 +12900229 2 12900162 12900230 +12900230 2 12900231 23400000 +12900231 2 12900232 25800000 +12900232 2 12900233 12900265 +12900233 2 12900032 12900234 +12900234 2 12900235 48900000 +12900235 2 12900236 21700000 +12900236 2 12900155 12900237 +12900237 2 12900012 12900238 +12900238 2 12900239 6800000 +12900239 2 12900240 7300000 +12900240 2 12900241 12900170 +12900241 2 12900242 12900246 +12900242 2 12900243 25600000 +12900243 2 12900099 12900244 +12900244 2 12900050 12900245 +12900245 2 12900068 12900246 +12900246 2 12900247 3500000 +12900247 2 12900248 45700000 +12900248 2 12900249 6700000 +12900249 2 12900250 12900181 +12900250 2 12900251 20800000 +12900251 2 12900252 12900270 +12900252 2 12900120 12900253 +12900253 2 12900254 19200000 +12900254 2 12900255 26000000 +12900255 2 12900256 12900118 +12900256 2 12900257 12900004 +12900257 2 12900258 12900135 +12900258 2 12900154 12900259 +12900259 2 12900260 43000000 +12900260 2 12900096 12900261 +12900261 2 12900010 12900262 +12900262 2 12900263 46400000 +12900263 2 12900264 12900223 +12900264 2 12900265 12900002 +12900265 2 12900266 32000000 +12900266 2 12900267 2800000 +12900267 2 12900114 12900268 +12900268 2 12900269 7500000 +12900269 2 12900156 12900270 +12900270 2 12900005 12900271 +12900271 2 12900272 12900154 +12900272 2 12900273 12900085 +12900273 2 12900274 8900000 +12900274 2 12900275 42500000 +12900275 2 12900050 12900276 +12900276 2 12900277 43500000 +12900277 2 12900098 12900278 +12900278 2 12900217 12900279 +12900279 2 12900280 31700000 +12900280 2 12900281 12900002 +12900281 2 12900282 48700000 +12900282 2 12900146 12900283 +12900283 2 12900284 11000000 +12900284 2 12900128 12900285 +12900285 2 12900286 12900079 +12900286 2 12900152 12900287 +12900287 2 12900288 12900183 +12900288 2 12900289 12900012 +12900289 2 12900290 12900310 +12900290 2 12900291 27200000 +12900291 2 12900292 31600000 +12900292 2 12900293 45400000 +12900293 2 12900118 12900294 +12900294 2 12900307 12900295 +12900295 2 12900296 12900180 +12900296 2 12900297 25100000 +12900297 2 12900298 15300000 +12900298 2 12900299 16200000 +12900299 2 12900300 43100000 +12900300 2 12900301 12900262 +12900301 2 12900302 12900279 +12900302 2 12900239 12900303 +12900303 2 12900304 38800000 +12900304 2 12900305 12900121 +12900305 2 12900306 24700000 +12900306 2 12900307 46800000 +12900307 2 12900009 12900308 +12900308 2 12900309 5800000 +12900309 2 12900310 12900199 +12900310 2 12900311 28900000 +12900311 2 12900312 13300000 +12900312 2 12900313 3400000 +12900313 2 12900314 1300000 +12900314 2 12900315 43200000 +12900315 2 12900051 12900316 +12900316 2 12900317 47300000 +12900317 2 12900224 12900318 +12900318 2 12900014 12900319 +12900319 2 12900320 12900247 +12900320 2 12900321 12900103 +12900321 2 12900322 12900111 +12900322 2 12900323 15500000 +12900323 2 12900324 49900000 +12900324 2 12900156 12900325 +12900325 2 12900065 12900326 +12900326 2 12900327 5300000 +12900327 2 12900328 5000000 +12900328 2 12900329 12900156 +12900329 2 12900330 12900301 +12900330 2 12900331 27900000 +12900331 2 12900332 10600000 +12900332 2 12900333 12900325 +12900333 2 12900334 3600000 +12900334 2 12900080 12900335 +12900335 2 12900336 12900182 +12900336 2 12900337 34400000 +12900337 1 45000000 + +-------------------------------------------- +47800000 +47800000 1 47800001 +47800001 1 47800002 +47800002 1 47800003 +47800003 1 47800003 + +-------------------------------------------- +31600000 +31600000 2 31600000 31600001 +31600001 1 31600002 +31600002 1 31600003 +31600003 0 + +-------------------------------------------- +45800000 +45800000 2 45800001 45800002 +45800001 1 45800002 +45800002 1 45800003 +45800003 2 45800002 45800004 +45800004 1 45800002 + +-------------------------------------------- +22100000 +22100000 1 22100001 +22100001 1 22100002 +22100002 1 22100003 +22100003 0 + +-------------------------------------------- +26700000 +26700000 1 26700000 + +-------------------------------------------- +31300000 +31300000 1 31300001 +31300001 1 31300002 +31300002 2 31300003 31300005 +31300003 2 31300000 31300004 +31300004 1 31300005 +31300005 1 31300006 +31300006 1 31300007 +31300007 2 31300008 31300000 +31300008 1 31300009 +31300009 1 31300010 +31300010 2 31300002 31300011 +31300011 1 31300005 + +-------------------------------------------- +1000000 +1000000 1 1000001 +1000001 1 1000002 +1000002 1 1000003 +1000003 1 1000004 +1000004 2 1000000 1000005 +1000005 1 1000006 +1000006 2 1000002 1000007 +1000007 1 1000008 +1000008 2 1000009 1000005 +1000009 1 1000006 + +-------------------------------------------- +35900000 +35900000 1 35900000 + +-------------------------------------------- +5600000 +5600000 1 5600001 +5600001 2 5600008 5600002 +5600002 1 5600003 +5600003 2 5600002 5600004 +5600004 1 5600005 +5600005 2 5600002 5600006 +5600006 1 5600007 +5600007 1 5600008 +5600008 2 5600009 5600004 +5600009 1 5600010 +5600010 2 5600003 5600011 +5600011 1 5600008 + +-------------------------------------------- +40500000 +40500000 1 40500001 +40500001 1 40500002 +40500002 1 40500000 + +-------------------------------------------- +34500000 +34500000 1 8100000 + +-------------------------------------------- +10200000 +10200000 1 10200001 +10200001 0 + +-------------------------------------------- +45100000 +45100000 1 45100001 +45100001 1 45100002 +45100002 1 45100003 +45100003 2 45100003 45100004 +45100004 1 45100005 +45100005 1 45100006 +45100006 1 45100001 + +-------------------------------------------- +14800000 +14800000 1 14800001 +14800001 1 14800002 +14800002 1 14800003 +14800003 2 14800000 14800004 +14800004 2 14800000 14800005 +14800005 1 14800000 + +-------------------------------------------- +49700000 +49700000 1 49700001 +49700001 1 49700001 + +-------------------------------------------- +19400000 +19400000 1 19400001 +19400001 1 19400002 +19400002 1 19400003 +19400003 1 19400004 +19400004 0 + +-------------------------------------------- +24000000 +24000000 1 24000001 +24000001 1 24000002 +24000002 2 24000000 24000003 +24000003 1 24000004 +24000004 1 24000005 +24000005 1 24000006 +24000006 2 24000001 24000007 +24000007 2 24000008 24000010 +24000008 1 24000009 +24000009 1 24000010 +24000010 1 24000008 + +-------------------------------------------- +28600000 +28600000 2 28600001 28600002 +28600001 2 28600002 28600012 +28600002 1 28600003 +28600003 2 28600004 28600007 +28600004 1 28600005 +28600005 1 28600006 +28600006 1 28600007 +28600007 1 28600008 +28600008 1 28600009 +28600009 1 28600010 +28600010 1 28600011 +28600011 2 28600003 28600012 +28600012 2 28600000 28600013 +28600013 0 + +-------------------------------------------- +31000000 +31000000 1 31000001 +31000001 2 31000001 31000002 +31000002 2 31000001 31000003 +31000003 1 31000004 +31000004 2 31000003 31000005 +31000005 0 + +-------------------------------------------- +20100000 +20100000 2 20100000 20100001 +20100001 1 20100002 +20100002 0 + +-------------------------------------------- +33200000 +33200000 1 33200000 + +-------------------------------------------- +2900000 +2900000 1 2900001 +2900001 1 2900001 + +-------------------------------------------- +37800000 +37800000 2 37800000 37800001 +37800001 2 37800000 37800002 +37800002 1 37800003 +37800003 1 37800002 + +-------------------------------------------- +7500000 +7500000 0 + +-------------------------------------------- +42400000 +42400000 2 42400000 42400001 +42400001 2 42400000 42400002 +42400002 2 42400000 42400003 +42400003 1 42400004 +42400004 1 42400005 +42400005 1 42400006 +42400006 1 42400007 +42400007 2 42400008 42400006 +42400008 1 42400009 +42400009 2 42400010 42400006 +42400010 1 42400011 +42400011 1 42400012 +42400012 1 42400013 +42400013 1 42400014 +42400014 1 42400004 + +-------------------------------------------- +12100000 +12100000 1 12100001 +12100001 1 12100001 + +-------------------------------------------- +47000000 +47000000 1 47000001 +47000001 1 47000002 +47000002 2 47000001 47000003 +47000003 2 47000001 47000004 +47000004 1 47000005 +47000005 0 + +-------------------------------------------- +16700000 +16700000 1 16700000 + +-------------------------------------------- +21300000 +21300000 1 21300000 + +-------------------------------------------- +33900000 +33900000 2 33900001 33900003 +33900001 1 33900002 +33900002 2 33900003 33900007 +33900003 1 33900004 +33900004 1 33900005 +33900005 1 33900006 +33900006 2 33900005 33900007 +33900007 0 + +-------------------------------------------- +25900000 +25900000 0 + +-------------------------------------------- +30500000 +30500000 1 30500000 + +-------------------------------------------- +200000 +200000 0 + +-------------------------------------------- +35100000 +35100000 1 35100001 +35100001 2 35100001 35100002 +35100002 1 35100003 +35100003 2 35100000 35100004 +35100004 0 + +-------------------------------------------- +4800000 +4800000 1 4800001 +4800001 0 + +-------------------------------------------- +39700000 +39700000 2 39700001 39700002 +39700001 2 39700000 39700002 +39700002 2 39700000 39700003 +39700003 1 39700003 + +-------------------------------------------- +9400000 +9400000 1 9400001 +9400001 1 9400002 +9400002 2 9400002 9400003 +9400003 1 9400004 +9400004 1 9400005 +9400005 0 + +-------------------------------------------- +44300000 +44300000 1 44300001 +44300001 0 + +-------------------------------------------- +36800000 +36800000 1 36800001 +36800001 1 36800001 + +-------------------------------------------- +45600000 +45600000 1 45600001 +45600001 2 45600000 45600002 +45600002 0 + +-------------------------------------------- +14000000 +14000000 0 + +-------------------------------------------- +48900000 +48900000 1 48900001 +48900001 1 48900001 + +-------------------------------------------- +2100000 +2100000 1 2100001 +2100001 1 2100002 +2100002 2 2100002 2100003 +2100003 2 2100002 2100004 +2100004 1 2100005 +2100005 1 2100006 +2100006 1 2100007 +2100007 1 2100008 +2100008 0 + +-------------------------------------------- +33300000 +33300000 1 33300001 +33300001 1 33300002 +33300002 2 33300001 33300003 +33300003 2 33300000 33300004 +33300004 1 33300005 +33300005 1 33300006 +33300006 0 + +-------------------------------------------- +6700000 +6700000 2 6700000 6700001 +6700001 1 6700002 +6700002 1 6700001 + +-------------------------------------------- +41600000 +41600000 0 + +-------------------------------------------- +46200000 +46200000 2 46200001 46200006 +46200001 1 46200002 +46200002 2 46200003 46200005 +46200003 2 46200004 46200007 +46200004 1 46200005 +46200005 2 46200005 46200006 +46200006 1 46200007 +46200007 1 46200008 +46200008 2 46200009 46200006 +46200009 1 46200001 + +-------------------------------------------- +20500000 +20500000 1 20500001 +20500001 1 20500000 + +-------------------------------------------- +25100000 +25100000 1 25100001 +25100001 2 25100002 25100003 +25100002 2 25100000 25100003 +25100003 1 25100004 +25100004 1 25100005 +25100005 1 25100006 +25100006 2 25100006 25100007 +25100007 2 25100008 25100007 +25100008 1 25100009 +25100009 1 25100010 +25100010 1 25100006 + +-------------------------------------------- +49000000 +49000000 2 49000001 49000003 +49000001 2 49000002 49000004 +49000002 1 49000003 +49000003 2 49000003 49000004 +49000004 1 49000000 + +-------------------------------------------- +29500000 +29500000 2 29500001 29500012 +29500001 1 29500002 +29500002 2 29500009 29500003 +29500003 1 29500004 +29500004 1 29500005 +29500005 1 29500006 +29500006 1 29500007 +29500007 1 29500008 +29500008 2 29500009 29500007 +29500009 1 29500010 +29500010 1 29500011 +29500011 2 29500002 29500012 +29500012 0 + +-------------------------------------------- +29700000 +29700000 0 + +-------------------------------------------- +36700000 +36700000 1 36700001 +36700001 2 36700000 36700002 +36700002 1 36700003 +36700003 2 36700001 36700004 +36700004 1 36700005 +36700005 2 36700005 36700006 +36700006 1 36700004 + +-------------------------------------------- +17500000 +17500000 1 17500000 + +-------------------------------------------- +34300000 +34300000 1 34300000 + +-------------------------------------------- +4000000 +4000000 1 4000000 + +-------------------------------------------- +38900000 +38900000 2 38900000 38900001 +38900001 1 38900002 +38900002 1 38900001 + +-------------------------------------------- +43500000 +43500000 1 43500001 +43500001 1 43500002 +43500002 2 43500000 43500003 +43500003 2 43500001 43500004 +43500004 2 43500002 43500005 +43500005 1 43500003 + +-------------------------------------------- +13200000 +13200000 1 13200001 +13200001 1 13200002 +13200002 1 13200003 +13200003 2 13200000 13200004 +13200004 0 + +-------------------------------------------- +48100000 +48100000 1 48100001 +48100001 1 48100001 + +-------------------------------------------- +39100000 +39100000 1 39100001 +39100001 2 39100000 39100002 +39100002 2 39100001 39100003 +39100003 0 + +-------------------------------------------- +43400000 +43400000 2 43400001 43400005 +43400001 1 43400002 +43400002 1 43400003 +43400003 2 43400004 43400006 +43400004 2 43400002 43400005 +43400005 2 43400003 43400006 +43400006 1 43400003 + +-------------------------------------------- +33800000 +33800000 1 33800000 + +-------------------------------------------- +24200000 +24200000 2 24200008 24200001 +24200001 1 24200002 +24200002 2 24200002 24200003 +24200003 2 24200008 24200004 +24200004 2 24200001 24200005 +24200005 2 24200004 24200006 +24200006 2 24200008 24200007 +24200007 1 24200008 +24200008 0 + +-------------------------------------------- +14600000 +14600000 1 14600001 +14600001 2 14600000 14600002 +14600002 2 14600002 14600003 +14600003 1 14600004 +14600004 1 14600005 +14600005 2 14600001 14600006 +14600006 1 14600007 +14600007 2 14600008 14600005 +14600008 1 14600009 +14600009 0 + +-------------------------------------------- +1300000 +1300000 2 1300000 1300001 +1300001 1 1300000 + +-------------------------------------------- +36200000 +36200000 1 36200001 +36200001 1 36200001 + +-------------------------------------------- +40800000 +40800000 2 40800001 40800002 +40800001 1 40800002 +40800002 2 40800001 40800003 +40800003 2 40800003 40800004 +40800004 1 40800005 +40800005 1 40800002 + +-------------------------------------------- +3600000 +3600000 2 3600001 3600002 +3600001 1 3600002 +3600002 2 3600001 3600003 +3600003 0 + +-------------------------------------------- +3800000 +3800000 1 3800001 +3800001 1 3800002 +3800002 1 3800003 +3800003 1 3800004 +3800004 1 3800005 +3800005 1 3800006 +3800006 2 3800000 3800007 +3800007 1 3800007 + +-------------------------------------------- +10500000 +10500000 0 + +-------------------------------------------- +45400000 +45400000 1 45400001 +45400001 2 45400000 45400002 +45400002 1 45400003 +45400003 1 45400004 +45400004 0 + +-------------------------------------------- +15100000 +15100000 1 15100001 +15100001 2 15100002 15100003 +15100002 2 15100001 15100003 +15100003 1 15100002 + +-------------------------------------------- +19700000 +19700000 1 19700001 +19700001 1 19700002 +19700002 1 19700003 +19700003 2 19700004 19700007 +19700004 1 19700005 +19700005 1 19700006 +19700006 2 19700002 19700007 +19700007 1 19700008 +19700008 1 19700009 +19700009 1 19700010 +19700010 1 19700011 +19700011 1 19700012 +19700012 1 19700011 + +-------------------------------------------- +24300000 +24300000 1 24300001 +24300001 1 24300002 +24300002 2 24300000 24300003 +24300003 1 24300004 +24300004 0 + +-------------------------------------------- +28900000 +28900000 2 28900000 28900001 +28900001 0 + +-------------------------------------------- +38500000 +38500000 0 + +-------------------------------------------- +33500000 +33500000 2 33500000 33500001 +33500001 1 33500001 + +-------------------------------------------- +3200000 +3200000 0 + +-------------------------------------------- +38100000 +38100000 1 38100001 +38100001 0 + +-------------------------------------------- +7800000 +7800000 1 7800001 +7800001 2 7800000 7800002 +7800002 2 7800002 7800003 +7800003 1 7800001 + +-------------------------------------------- +42700000 +42700000 2 42700000 42700001 +42700001 2 42700000 42700002 +42700002 1 42700003 +42700003 1 42700004 +42700004 1 42700005 +42700005 2 42700001 42700006 +42700006 1 42700007 +42700007 1 42700008 +42700008 1 42700009 +42700009 2 42700000 42700010 +42700010 1 42700011 +42700011 1 42700012 +42700012 1 42700002 + +-------------------------------------------- +12400000 +12400000 2 12400000 12400001 +12400001 2 12400000 26200000 + +-------------------------------------------- +47300000 +47300000 1 47300001 +47300001 2 47300002 47300007 +47300002 2 47300000 47300003 +47300003 2 47300000 47300004 +47300004 2 47300005 47300006 +47300005 1 47300006 +47300006 2 47300004 47300007 +47300007 2 47300008 47300006 +47300008 1 47300009 +47300009 2 47300000 47300010 +47300010 2 47300011 47300007 +47300011 0 + +-------------------------------------------- +17000000 +17000000 1 17000001 +17000001 1 17000001 + +-------------------------------------------- +21600000 +21600000 2 21600001 21600007 +21600001 2 21600002 21600006 +21600002 1 21600003 +21600003 2 21600009 21600004 +21600004 2 21600009 21600005 +21600005 2 21600000 21600006 +21600006 1 21600007 +21600007 1 21600008 +21600008 1 21600009 +21600009 1 21600010 +21600010 2 21600011 21600007 +21600011 1 21600012 +21600012 0 + +-------------------------------------------- +41400000 +41400000 0 + +-------------------------------------------- +29300000 +29300000 1 29300000 + +-------------------------------------------- +26200000 +26200000 2 26200000 26200001 +26200001 0 + +-------------------------------------------- +30800000 +30800000 0 + +-------------------------------------------- +500000 +500000 1 500001 +500001 2 500000 500002 +500002 1 500003 +500003 1 500004 +500004 1 500005 +500005 2 500001 500006 +500006 2 500005 500007 +500007 1 500008 +500008 2 500000 500009 +500009 1 500004 + +-------------------------------------------- +35400000 +35400000 0 + +-------------------------------------------- +5100000 +5100000 1 5100001 +5100001 0 + +-------------------------------------------- +40000000 +40000000 0 + +-------------------------------------------- +9700000 +9700000 1 9700001 +9700001 2 9700001 9700002 +9700002 0 + +-------------------------------------------- +44600000 +44600000 1 44600001 +44600001 2 44600001 44600002 +44600002 1 44600003 +44600003 2 44600000 44600004 +44600004 1 44600005 +44600005 1 44600004 + +-------------------------------------------- +5900000 +5900000 1 5900001 +5900001 1 5900002 +5900002 2 5900001 5900003 +5900003 1 5900004 +5900004 1 5900005 +5900005 2 5900001 5900006 +5900006 2 5900009 5900007 +5900007 2 5900008 5900000 +5900008 2 5900009 5900006 +5900009 2 5900009 5900010 +5900010 2 5900011 5900006 +5900011 2 5900012 5900006 +5900012 2 5900009 5900013 +5900013 0 + +-------------------------------------------- +14300000 +14300000 2 14300001 14300003 +14300001 2 14300001 14300002 +14300002 1 14300003 +14300003 2 14300002 14300004 +14300004 1 14300005 +14300005 1 14300006 +14300006 0 + +-------------------------------------------- +49200000 +49200000 1 49200001 +49200001 2 49200009 49200002 +49200002 1 49200003 +49200003 1 49200004 +49200004 1 49200005 +49200005 1 49200006 +49200006 2 49200000 49200007 +49200007 1 49200008 +49200008 1 49200009 +49200009 1 49200010 +49200010 0 + +-------------------------------------------- +18900000 +18900000 1 18900001 +18900001 0 + +-------------------------------------------- +23500000 +23500000 1 23500001 +23500001 1 23500001 + +-------------------------------------------- +28100000 +28100000 2 28100000 28100001 +28100001 1 28100001 + +-------------------------------------------- +32700000 +32700032 2 32700033 21000000 +32700033 2 32700034 48000000 +32700034 1 32700002 +32700000 2 32700001 32700021 +32700001 2 32700002 37700000 +32700002 2 32700003 9400000 +32700003 1 32700004 +32700004 2 32700000 32700005 +32700005 2 32700002 32700006 +32700006 2 32700007 39800000 +32700007 2 32700008 32700033 +32700008 2 32700008 32700009 +32700009 2 32700010 38000000 +32700010 2 32700011 11100000 +32700011 2 32700012 47700000 +32700012 1 32700013 +32700013 2 32700005 32700014 +32700014 2 32700032 32700015 +32700015 1 32700016 +32700016 2 32700017 32700009 +32700017 2 32700018 32700015 +32700018 1 32700019 +32700019 2 32700020 32700021 +32700020 2 32700021 39400000 +32700021 2 32700022 1600000 +32700022 2 32700023 17600000 +32700023 2 32700024 32700019 +32700024 2 32700025 22500000 +32700025 2 32700026 32700013 +32700026 2 32700027 34500000 +32700027 2 32700028 3800000 +32700028 2 32700029 28700000 +32700029 2 32700030 37600000 +32700030 2 32700015 32700031 +32700031 2 32700032 32700000 + +-------------------------------------------- +2400000 +2400000 2 2400000 2400001 +2400001 2 2400001 2400002 +2400002 1 16400000 + +-------------------------------------------- +37300000 +37300000 1 37300001 +37300001 1 37300002 +37300002 1 37300003 +37300003 0 + +-------------------------------------------- +34400000 +34400000 1 34400001 +34400001 1 34400002 +34400002 2 34400000 34400003 +34400003 1 34400004 +34400004 2 34400001 34400005 +34400005 2 34400000 34400006 +34400006 1 34400000 + +-------------------------------------------- +6800000 +6800000 1 6800001 +6800001 1 6800002 +6800002 1 6800003 +6800003 1 6800004 +6800004 1 6800005 +6800005 1 6800006 +6800006 1 6800007 +6800007 1 6800008 +6800008 2 6800009 6800002 +6800009 1 6800010 +6800010 0 + +-------------------------------------------- +7000000 +7000000 1 7000001 +7000001 2 7000001 7000002 +7000002 1 7000001 + +-------------------------------------------- +41900000 +41900000 2 41900000 41900001 +41900001 1 41900000 + +-------------------------------------------- +11600000 +11600000 2 11600001 11600006 +11600001 1 11600002 +11600002 2 11600001 11600003 +11600003 2 11600002 11600004 +11600004 2 11600004 11600005 +11600005 1 11600006 +11600006 2 11600005 11600007 +11600007 1 11600008 +11600008 1 11600009 +11600009 1 11600010 +11600010 2 11600011 11600003 +11600011 0 + +-------------------------------------------- +46500000 +46500000 1 46500001 +46500001 1 46500002 +46500002 1 46500003 +46500003 1 46500003 + +-------------------------------------------- +16200000 +16200000 1 16200001 +16200001 1 16200002 +16200002 1 16200001 + +-------------------------------------------- +20800000 +20800000 2 20800000 20800001 +20800001 1 20800002 +20800002 2 20800018 20800003 +20800003 1 20800004 +20800004 1 20800005 +20800005 1 20800006 +20800006 1 20800007 +20800007 2 20800008 20800006 +20800008 2 20800016 20800009 +20800009 1 20800010 +20800010 2 20800010 20800011 +20800011 1 20800012 +20800012 1 20800013 +20800013 2 20800006 20800014 +20800014 2 20800000 20800015 +20800015 1 20800016 +20800016 1 20800017 +20800017 1 20800018 +20800018 2 20800019 20800005 +20800019 1 20800020 +20800020 1 20800005 + +-------------------------------------------- +25400000 +25400000 1 25400001 +25400001 2 25400002 25400004 +25400002 1 25400003 +25400003 2 25400003 25400004 +25400004 2 25400005 25400006 +25400005 1 25400006 +25400006 0 + +-------------------------------------------- +43700000 +43700000 1 43700001 +43700001 2 43700002 43700006 +43700002 1 43700003 +43700003 1 43700004 +43700004 1 43700005 +43700005 1 43700006 +43700006 1 43700000 + +-------------------------------------------- +30000000 +30000000 2 30000000 30000001 +30000001 1 30000002 +30000002 1 30000003 +30000003 2 30000000 30000004 +30000004 1 30000005 +30000005 2 30000008 30000006 +30000006 2 30000006 30000007 +30000007 1 30000008 +30000008 1 30000009 +30000009 1 30000010 +30000010 1 30000011 +30000011 1 30000010 + +-------------------------------------------- +34600000 +34600000 2 34600001 34600014 +34600001 1 34600002 +34600002 1 34600003 +34600003 1 34600004 +34600004 2 34600005 34600007 +34600005 2 34600001 34600006 +34600006 2 34600005 34600007 +34600007 2 34600008 34600011 +34600008 2 34600009 34600013 +34600009 2 34600010 34600007 +34600010 2 34600010 34600011 +34600011 1 34600012 +34600012 2 34600004 34600013 +34600013 1 34600014 +34600014 1 34600015 +34600015 0 + +-------------------------------------------- +4300000 +4300000 1 4300001 +4300001 2 4300000 4300002 +4300002 0 + +-------------------------------------------- +39200000 +39200000 1 39200001 +39200001 1 39200002 +39200002 1 39200003 +39200003 1 39200004 +39200004 1 39200005 +39200005 1 39200006 +39200006 1 39200007 +39200007 1 39200008 +39200008 1 39200003 + +-------------------------------------------- +8900000 +8900000 1 8900001 +8900001 1 8900002 +8900002 2 8900001 8900003 +8900003 2 8900004 8900006 +8900004 2 8900003 8900005 +8900005 1 8900006 +8900006 2 8900002 8900007 +8900007 1 8900006 + +-------------------------------------------- +43800000 +43800000 0 + +-------------------------------------------- +13500000 +13500000 2 13500000 13500001 +13500001 2 13500002 13500004 +13500002 2 13500001 13500003 +13500003 2 13500016 13500004 +13500004 2 13500017 13500005 +13500005 1 13500006 +13500006 2 13500004 13500007 +13500007 1 13500008 +13500008 1 13500009 +13500009 2 13500010 13500005 +13500010 1 13500011 +13500011 2 13500002 13500012 +13500012 1 13500013 +13500013 2 13500019 13500014 +13500014 1 13500015 +13500015 1 13500016 +13500016 2 13500017 13500003 +13500017 1 13500018 +13500018 2 13500018 13500019 +13500019 2 13500020 13500022 +13500020 1 13500021 +13500021 2 13500013 13500022 +13500022 1 13500013 + +-------------------------------------------- +48400000 +48400000 1 48400001 +48400001 2 48400002 48400004 +48400002 1 48400003 +48400003 2 48400002 48400004 +48400004 1 48400001 + +-------------------------------------------- +18100000 +18100000 0 + +-------------------------------------------- +46600000 +46600000 2 46600001 46600006 +46600001 1 46600002 +46600002 1 46600003 +46600003 1 46600004 +46600004 1 46600005 +46600005 1 46600006 +46600006 1 46600007 +46600007 2 46600008 46600006 +46600008 1 46600002 + +-------------------------------------------- +9900000 +9900000 2 9900000 9900001 +9900001 1 9900002 +9900002 2 9900009 9900003 +9900003 1 9900004 +9900004 2 9900009 9900005 +9900005 2 9900003 9900006 +9900006 1 9900007 +9900007 1 9900008 +9900008 1 9900009 +9900009 2 9900010 9900004 +9900010 1 9900010 + +-------------------------------------------- +22700000 +22700000 1 22700000 + +-------------------------------------------- +27300000 +27300000 1 27300001 +27300001 2 27300002 27300004 +27300002 2 27300003 27300007 +27300003 2 27300003 27300004 +27300004 1 27300005 +27300005 1 27300006 +27300006 2 27300000 27300007 +27300007 2 27300008 27300004 +27300008 0 + +-------------------------------------------- +31900000 +31900000 2 31900000 31900001 +31900001 0 + +-------------------------------------------- +1600000 +1600000 1 1600001 +1600001 1 1600002 +1600002 1 1600003 +1600003 1 1600004 +1600004 0 + +-------------------------------------------- +36500000 +36500000 1 36500001 +36500001 2 36500002 36500006 +36500002 1 36500003 +36500003 2 36500000 36500004 +36500004 2 36500008 36500005 +36500005 1 36500006 +36500006 2 36500012 36500007 +36500007 1 36500008 +36500008 1 36500009 +36500009 1 36500010 +36500010 1 36500011 +36500011 2 36500004 36500012 +36500012 1 36500013 +36500013 2 36500014 36500015 +36500014 1 36500015 +36500015 1 36500002 + +-------------------------------------------- +6200000 +6200000 1 6200001 +6200001 0 + +-------------------------------------------- +41100000 +41100000 2 41100000 41100001 +41100001 1 41100002 +41100002 1 41100003 +41100003 2 41100001 41100004 +41100004 2 41100000 41100005 +41100005 1 41100006 +41100006 0 + +-------------------------------------------- +43100000 +43100000 2 43100000 43100001 +43100001 1 43100002 +43100002 1 43100003 +43100003 2 43100004 43100013 +43100004 2 43100005 43100022 +43100005 2 43100000 43100006 +43100006 1 43100007 +43100007 1 43100008 +43100008 1 43100009 +43100009 1 43100010 +43100010 1 43100011 +43100011 1 43100012 +43100012 2 43100013 43100021 +43100013 1 43100014 +43100014 1 43100015 +43100015 1 43100016 +43100016 1 43100017 +43100017 1 43100018 +43100018 2 43100019 43100014 +43100019 1 43100020 +43100020 1 43100021 +43100021 2 43100002 43100022 +43100022 1 43100023 +43100023 1 43100021 + +-------------------------------------------- +10800000 +10800000 1 10800001 +10800001 2 10800000 10800002 +10800002 1 10800002 + +-------------------------------------------- +45700000 +45700000 1 45700000 + +-------------------------------------------- +15400000 +15400000 1 15400001 +15400001 0 + +-------------------------------------------- +20000000 +20000000 1 20000001 +20000001 1 20000002 +20000002 2 20000000 20000003 +20000003 1 20000001 + +-------------------------------------------- +24600000 +24600000 2 24600000 24600001 +24600001 1 24600002 +24600002 2 24600000 24600003 +24600003 2 24600000 24600004 +24600004 1 24600005 +24600005 2 24600002 24600006 +24600006 0 + +-------------------------------------------- +29200000 +29200000 2 29200000 29200001 +29200001 0 + +-------------------------------------------- +46000000 +46000000 1 46000001 +46000001 1 46000002 +46000002 1 46000003 +46000003 1 46000004 +46000004 1 46000005 +46000005 2 46000011 46000006 +46000006 2 46000006 46000007 +46000007 1 46000008 +46000008 2 46000009 46000010 +46000009 2 46000010 46000005 +46000010 1 46000011 +46000011 2 46000010 46000012 +46000012 2 46000013 46000014 +46000013 2 46000008 46000014 +46000014 1 46000015 +46000015 1 46000016 +46000016 1 46000017 +46000017 0 + +-------------------------------------------- +22600000 +22600000 2 22600000 22600001 +22600001 2 22600002 22600003 +22600002 1 22600003 +22600003 2 22600009 22600004 +22600004 1 22600005 +22600005 1 22600006 +22600006 1 22600007 +22600007 2 22600008 22600006 +22600008 2 22600008 22600009 +22600009 1 22600010 +22600010 2 22600019 22600011 +22600011 2 22600011 22600012 +22600012 1 22600013 +22600013 1 22600014 +22600014 1 22600015 +22600015 2 22600016 22600018 +22600016 2 22600017 22600001 +22600017 1 22600018 +22600018 2 22600019 22600012 +22600019 0 + +-------------------------------------------- +3500000 +3500000 1 3500001 +3500001 2 3500001 3500002 +3500002 2 3500000 3500003 +3500003 2 3500003 3500004 +3500004 2 3500016 3500005 +3500005 1 3500006 +3500006 2 3500008 3500007 +3500007 2 3500008 3500000 +3500008 1 3500009 +3500009 2 3500010 3500020 +3500010 1 3500011 +3500011 2 3500017 3500012 +3500012 1 3500013 +3500013 2 3500002 3500014 +3500014 1 3500015 +3500015 1 3500016 +3500016 1 3500017 +3500017 1 3500018 +3500018 1 3500019 +3500019 1 3500020 +3500020 1 3500021 +3500021 1 3500022 +3500022 1 3500007 + +-------------------------------------------- +38400000 +38400000 2 38400000 38400001 +38400001 1 38400002 +38400002 1 38400003 +38400003 1 38400004 +38400004 0 + +-------------------------------------------- +8100000 +8100000 1 8100001 +8100001 2 8100001 8100002 +8100002 2 8100002 8100003 +8100003 1 3100000 + +-------------------------------------------- +43000000 +43000000 1 43000001 +43000001 0 + +-------------------------------------------- +23900000 +23900000 1 23900001 +23900001 2 23900001 23900002 +23900002 2 23900001 23900003 +23900003 1 23900004 +23900004 0 + +-------------------------------------------- +12700000 +12700000 0 + +-------------------------------------------- +47600000 +47600000 2 47600000 47600001 +47600001 1 47600002 +47600002 1 47600003 +47600003 2 47600002 47600004 +47600004 1 47600005 +47600005 0 + +-------------------------------------------- +17300000 +17300000 2 17300000 17300001 +17300001 1 17300002 +17300002 0 + +-------------------------------------------- +21900000 +21900000 1 21900001 +21900001 2 21900001 21900002 +21900002 0 + +-------------------------------------------- +42500000 +42500000 1 42500001 +42500001 1 42500000 + +-------------------------------------------- +26500000 +26500000 2 26500001 26500004 +26500001 1 26500002 +26500002 2 26500000 26500003 +26500003 2 26500003 26500004 +26500004 0 + +-------------------------------------------- +31100000 +31100000 2 31100001 31100005 +31100001 2 31100002 31100010 +31100002 2 31100003 31100005 +31100003 1 31100004 +31100004 1 31100005 +31100005 1 31100006 +31100006 2 31100000 31100007 +31100007 1 31100008 +31100008 1 31100009 +31100009 1 31100010 +31100010 1 31100011 +31100011 1 31100012 +31100012 1 31100013 +31100013 1 31100014 +31100014 0 + +-------------------------------------------- +800000 +800000 1 800001 +800001 1 800002 +800002 1 800002 + +-------------------------------------------- +35700000 +35700224 2 35700225 7100000 +35700225 2 35700048 35700226 +35700226 2 35700033 35700227 +35700227 2 35700228 35700151 +35700228 2 35700244 35700229 +35700229 2 35700230 42900000 +35700230 2 35700040 35700231 +35700231 2 35700232 6000000 +35700232 2 35700233 34900000 +35700233 2 35700234 8200000 +35700234 2 35700235 35700004 +35700235 2 35700236 23800000 +35700236 2 35700091 35700237 +35700237 2 35700238 31200000 +35700238 2 35700090 35700239 +35700239 2 35700240 16000000 +35700240 2 35700241 20400000 +35700241 2 35700242 42000000 +35700242 2 35700243 35700039 +35700243 2 35700244 0 +35700244 2 35700196 35700245 +35700245 2 35700246 33400000 +35700246 2 35700247 24200000 +35700247 2 35700248 35700032 +35700248 2 35700249 35700020 +35700249 2 35700250 25700000 +35700250 2 35700024 35700251 +35700251 2 35700252 47400000 +35700252 2 35700253 35700175 +35700253 2 35700171 35700254 +35700254 2 35700150 35700255 +35700255 2 35700256 35700110 +35700256 2 35700257 1100000 +35700257 2 35700258 35700098 +35700258 2 35700259 35700230 +35700259 2 35700260 49700000 +35700260 1 47000000 +35700000 2 35700001 35700054 +35700001 2 35700000 35700002 +35700002 2 35700003 35700004 +35700003 2 35700004 5100000 +35700004 2 35700005 49400000 +35700005 2 35700001 35700006 +35700006 2 35700121 35700007 +35700007 2 35700008 43300000 +35700008 2 35700009 35700197 +35700009 2 35700010 500000 +35700010 2 35700011 35700006 +35700011 2 35700012 42200000 +35700012 2 35700226 35700013 +35700013 2 35700010 35700014 +35700014 2 35700012 35700015 +35700015 2 35700016 800000 +35700016 2 35700017 11900000 +35700017 2 35700018 36100000 +35700018 2 35700040 35700019 +35700019 2 35700020 23300000 +35700020 2 35700021 41300000 +35700021 2 35700022 29600000 +35700022 2 35700023 38200000 +35700023 2 35700024 36400000 +35700024 2 35700025 35700018 +35700025 2 35700026 35700182 +35700026 2 35700027 35700020 +35700027 2 35700028 44000000 +35700028 2 35700026 35700029 +35700029 2 35700030 13600000 +35700030 2 35700031 44300000 +35700031 2 35700032 36600000 +35700032 2 35700033 35700022 +35700033 2 35700034 22100000 +35700034 2 35700035 35700004 +35700035 2 35700036 11800000 +35700036 2 35700037 17400000 +35700037 2 35700126 35700038 +35700038 2 35700228 35700039 +35700039 2 35700040 35700128 +35700040 2 35700041 35700073 +35700041 2 35700042 8800000 +35700042 2 35700043 46100000 +35700043 2 35700044 20700000 +35700044 2 35700045 11400000 +35700045 2 35700046 14700000 +35700046 2 35700003 35700047 +35700047 2 35700048 35700047 +35700048 2 35700049 35700035 +35700049 2 35700050 35700045 +35700050 2 35700051 18700000 +35700051 2 35700052 8300000 +35700052 2 35700053 14600000 +35700053 2 35700054 22400000 +35700054 2 35700190 35700055 +35700055 2 35700056 35700036 +35700056 2 35700057 6900000 +35700057 2 35700058 5600000 +35700058 2 35700059 37000000 +35700059 2 35700000 35700060 +35700060 2 35700061 35700039 +35700061 2 35700062 13000000 +35700062 2 35700063 29400000 +35700063 2 35700064 35700045 +35700064 2 35700065 19900000 +35700065 2 35700066 33300000 +35700066 2 35700019 35700067 +35700067 2 35700068 35700174 +35700068 2 35700069 2300000 +35700069 2 35700070 16400000 +35700070 2 35700200 35700071 +35700071 2 35700072 35700046 +35700072 2 35700073 35700214 +35700073 2 35700032 35700074 +35700074 2 35700075 15400000 +35700075 2 35700076 35700173 +35700076 2 35700012 35700077 +35700077 2 35700078 35700039 +35700078 2 35700082 35700079 +35700079 2 35700080 7000000 +35700080 2 35700081 10800000 +35700081 2 35700082 35700018 +35700082 2 35700083 19800000 +35700083 2 35700084 20000000 +35700084 2 35700192 35700085 +35700085 2 35700086 34700000 +35700086 2 35700218 35700087 +35700087 2 35700088 35700124 +35700088 2 35700089 35700219 +35700089 2 35700090 35700218 +35700090 2 35700009 35700091 +35700091 2 35700192 35700092 +35700092 2 35700093 38100000 +35700093 2 35700075 35700094 +35700094 2 35700095 27000000 +35700095 2 35700096 42600000 +35700096 2 35700097 33900000 +35700097 2 35700098 41900000 +35700098 2 35700099 19000000 +35700099 2 35700074 35700100 +35700100 2 35700101 47500000 +35700101 2 35700097 35700102 +35700102 2 35700103 37400000 +35700103 2 35700104 19600000 +35700104 2 35700112 35700105 +35700105 2 35700106 9900000 +35700106 2 35700107 35700062 +35700107 2 35700018 35700108 +35700108 2 35700109 33200000 +35700109 2 35700110 21800000 +35700110 2 35700090 35700111 +35700111 2 35700112 21400000 +35700112 2 35700113 35700083 +35700113 2 35700114 20600000 +35700114 2 35700115 1900000 +35700115 2 35700116 35700077 +35700116 2 35700117 35200000 +35700117 2 35700118 29800000 +35700118 2 35700119 40400000 +35700119 2 35700120 35700088 +35700120 2 35700144 35700121 +35700121 2 35700097 35700122 +35700122 2 35700123 46500000 +35700123 2 35700124 23200000 +35700124 2 35700081 35700125 +35700125 2 35700126 32300000 +35700126 2 35700127 48600000 +35700127 2 35700128 46600000 +35700128 2 35700129 35700057 +35700129 2 35700130 35700206 +35700130 2 35700178 35700131 +35700131 2 35700132 35700117 +35700132 2 35700133 12300000 +35700133 2 35700213 35700134 +35700134 2 35700113 35700135 +35700135 2 35700136 7600000 +35700136 2 35700137 28100000 +35700137 2 35700138 35700054 +35700138 2 35700139 49200000 +35700139 2 35700140 19500000 +35700140 2 35700040 35700141 +35700141 2 35700108 35700142 +35700142 2 35700183 35700143 +35700143 2 35700144 47900000 +35700144 2 35700145 35700097 +35700145 2 35700146 37900000 +35700146 2 35700147 20100000 +35700147 2 35700148 10200000 +35700148 2 35700149 16300000 +35700149 2 35700150 35700111 +35700150 2 35700151 23600000 +35700151 2 35700152 35700084 +35700152 2 35700153 35700014 +35700153 2 35700154 39700000 +35700154 2 35700155 9800000 +35700155 2 35700123 35700156 +35700156 2 35700157 35700007 +35700157 2 35700158 16800000 +35700158 2 35700009 35700159 +35700159 2 35700160 35700204 +35700160 2 35700161 32900000 +35700161 2 35700162 42800000 +35700162 2 35700041 35700163 +35700163 2 35700025 35700164 +35700164 2 35700165 22600000 +35700165 2 35700029 35700166 +35700166 2 35700001 35700167 +35700167 2 35700168 35700160 +35700168 2 35700169 44100000 +35700169 2 35700170 35700150 +35700170 2 35700171 18600000 +35700171 2 35700172 4800000 +35700172 2 35700173 17500000 +35700173 2 35700174 27800000 +35700174 2 35700175 39500000 +35700175 2 35700176 32600000 +35700176 2 35700177 35700097 +35700177 2 35700178 35700172 +35700178 2 35700179 41000000 +35700179 2 35700203 35700180 +35700180 2 35700181 35700206 +35700181 2 35700236 35700182 +35700182 2 35700089 35700183 +35700183 2 35700184 35700077 +35700184 2 35700088 35700185 +35700185 2 35700186 35700123 +35700186 2 35700187 3000000 +35700187 2 35700188 40200000 +35700188 2 35700189 35700133 +35700189 2 35700190 32800000 +35700190 2 35700191 33000000 +35700191 2 35700192 44800000 +35700192 2 35700193 4700000 +35700193 2 35700194 12000000 +35700194 2 35700195 28500000 +35700195 2 35700196 6500000 +35700196 2 35700197 40500000 +35700197 2 35700025 35700198 +35700198 2 35700239 35700199 +35700199 2 35700200 48800000 +35700200 2 35700201 2700000 +35700201 2 35700202 35700151 +35700202 2 35700203 35700037 +35700203 2 35700170 35700204 +35700204 2 35700205 17300000 +35700205 2 35700134 35700206 +35700206 2 35700008 35700207 +35700207 2 35700208 38500000 +35700208 2 35700209 35700081 +35700209 2 35700210 38400000 +35700210 2 35700211 35700164 +35700211 2 35700210 35700212 +35700212 2 35700213 10900000 +35700213 2 35700214 14200000 +35700214 2 35700215 30300000 +35700215 2 35700216 2500000 +35700216 2 35700217 35700179 +35700217 2 35700145 35700218 +35700218 2 35700219 35700139 +35700219 2 35700220 35700109 +35700220 2 35700221 30800000 +35700221 2 35700117 35700222 +35700222 2 35700223 39000000 +35700223 2 35700224 29500000 + +-------------------------------------------- +5400000 +5400000 2 5400000 42700000 + +-------------------------------------------- +40300000 +40300000 2 40300001 40300002 +40300001 2 40300002 40300004 +40300002 1 40300003 +40300003 1 40300004 +40300004 0 + +-------------------------------------------- +10000000 +10000000 1 10000001 +10000001 1 10000002 +10000002 1 10000002 + +-------------------------------------------- +44900000 +44900000 0 + +-------------------------------------------- +39000000 +39000000 2 39000001 39000002 +39000001 1 39000002 +39000002 0 + +-------------------------------------------- +19300000 +19300000 1 19300001 +19300001 0 + +-------------------------------------------- +19200000 +19200000 2 19200000 19200001 +19200001 1 19200002 +19200002 1 19200003 +19200003 2 19200002 19200004 +19200004 1 19200005 +19200005 1 19200004 + +-------------------------------------------- +23800000 +23800000 2 23800000 23800001 +23800001 0 + +-------------------------------------------- +28400000 +28400000 1 28400001 +28400001 2 28400000 42600000 + +-------------------------------------------- +33000000 +33000000 1 33000001 +33000001 0 + +-------------------------------------------- +2700000 +2700000 1 2700001 +2700001 2 2700000 2700002 +2700002 2 2700000 2700003 +2700003 1 2700000 + +-------------------------------------------- +37600000 +37600000 2 37600000 37600001 +37600001 0 + +-------------------------------------------- +48300000 +48300000 0 + +-------------------------------------------- +7300000 +7300000 1 7300000 + +-------------------------------------------- +42200000 +42200000 1 42200001 +42200001 1 42200002 +42200002 2 42200001 42200003 +42200003 1 42200004 +42200004 0 + +-------------------------------------------- +11900000 +11900000 1 11900001 +11900001 1 11900002 +11900002 2 11900001 11900003 +11900003 2 11900001 11900004 +11900004 2 11900002 11900005 +11900005 1 11900004 + +-------------------------------------------- +46800000 +46800000 2 46800001 14100000 +46800001 2 46800002 46800062 +46800002 2 46800000 46800003 +46800003 2 46800001 46800004 +46800004 2 46800004 46800005 +46800005 2 46800006 40300000 +46800006 2 46800007 4500000 +46800007 2 46800008 45800000 +46800008 2 46800009 8700000 +46800009 2 46800010 29000000 +46800010 2 46800000 46800011 +46800011 2 46800012 29900000 +46800012 2 46800013 40100000 +46800013 2 46800014 8000000 +46800014 2 46800015 1400000 +46800015 2 46800016 11500000 +46800016 2 46800017 24900000 +46800017 2 46800018 46800044 +46800018 2 46800016 46800019 +46800019 2 46800010 46800020 +46800020 2 46800021 44900000 +46800021 2 46800160 46800022 +46800022 2 46800023 41200000 +46800023 2 46800024 46800093 +46800024 2 46800025 45200000 +46800025 2 46800026 2600000 +46800026 2 46800010 46800027 +46800027 2 46800028 7900000 +46800028 2 46800029 32500000 +46800029 2 46800026 46800030 +46800030 2 46800031 24100000 +46800031 2 46800032 43900000 +46800032 2 46800033 46800004 +46800033 2 46800034 31100000 +46800034 2 46800035 46800005 +46800035 2 46800036 27700000 +46800036 2 46800037 42100000 +46800037 2 46800038 25300000 +46800038 2 46800039 8500000 +46800039 2 46800040 26800000 +46800040 2 46800041 45500000 +46800041 2 46800042 46800015 +46800042 2 46800043 8600000 +46800043 2 46800044 46800021 +46800044 2 46800024 46800045 +46800045 2 46800147 46800046 +46800046 2 46800038 46800047 +46800047 2 46800048 46800069 +46800048 2 46800049 12100000 +46800049 2 46800050 46800045 +46800050 1 46800051 +46800051 2 46800052 48200000 +46800052 2 46800057 46800053 +46800053 2 46800034 46800054 +46800054 2 46800005 46800055 +46800055 2 46800056 46800132 +46800056 2 46800057 13900000 +46800057 2 46800058 30700000 +46800058 2 46800059 46800043 +46800059 2 46800060 25500000 +46800060 2 46800124 46800061 +46800061 2 46800034 46800062 +46800062 2 46800063 38700000 +46800063 2 46800064 38300000 +46800064 2 46800065 28000000 +46800065 2 46800066 39200000 +46800066 2 46800066 46800067 +46800067 2 46800067 46800068 +46800068 2 46800048 46800069 +46800069 2 46800012 46800070 +46800070 2 46800007 46800071 +46800071 2 46800072 44200000 +46800072 2 46800073 41800000 +46800073 2 46800074 46800071 +46800074 2 46800075 46800030 +46800075 2 46800076 7200000 +46800076 2 46800066 46800077 +46800077 2 46800078 9600000 +46800078 2 46800010 46800079 +46800079 2 46800080 46800064 +46800080 2 46800081 35700000 +46800081 2 46800082 32200000 +46800082 2 46800083 38600000 +46800083 2 46800084 7700000 +46800084 2 46800085 16500000 +46800085 2 46800059 46800086 +46800086 2 46800113 46800087 +46800087 2 46800088 12400000 +46800088 2 46800089 11200000 +46800089 2 46800090 44600000 +46800090 2 46800098 46800091 +46800091 2 46800092 1000000 +46800092 2 46800093 14500000 +46800093 2 46800075 46800094 +46800094 2 46800074 46800095 +46800095 2 46800096 46800016 +46800096 2 46800097 46800042 +46800097 2 46800098 13800000 +46800098 2 46800099 4200000 +46800099 2 46800100 9300000 +46800100 2 46800101 15200000 +46800101 2 46800102 22800000 +46800102 2 46800103 20900000 +46800103 2 46800104 46800070 +46800104 2 46800105 25400000 +46800105 2 46800040 46800106 +46800106 2 46800107 46300000 +46800107 2 46800108 39900000 +46800108 2 46800042 46800109 +46800109 2 46800110 40000000 +46800110 2 46800106 46800111 +46800111 2 46800112 39600000 +46800112 2 46800113 46800090 +46800113 2 46800114 46800086 +46800114 1 46800115 +46800115 2 46800017 46800116 +46800116 2 46800117 49000000 +46800117 2 46800118 200000 +46800118 2 46800050 46800119 +46800119 2 46800120 46800067 +46800120 1 46800121 +46800121 2 46800122 18100000 +46800122 2 46800123 46800070 +46800123 2 46800124 19300000 +46800124 2 46800059 46800125 +46800125 2 46800126 45100000 +46800126 2 46800005 46800127 +46800127 2 46800128 30400000 +46800128 2 46800129 46800126 +46800129 2 46800130 46800101 +46800130 2 46800131 12800000 +46800131 2 46800132 40600000 +46800132 2 46800065 46800133 +46800133 2 46800134 12200000 +46800134 2 46800127 46800135 +46800135 2 46800136 49600000 +46800136 2 46800137 46800097 +46800137 2 46800025 46800138 +46800138 2 46800139 6100000 +46800139 2 46800140 46800119 +46800140 2 46800136 46800141 +46800141 2 46800142 23700000 +46800142 2 46800143 47800000 +46800143 2 46800144 25000000 +46800144 2 46800145 4000000 +46800145 2 46800146 24500000 +46800146 2 46800147 46800067 +46800147 2 46800148 28600000 +46800148 2 46800011 46800149 +46800149 2 46800134 46800150 +46800150 2 46800137 46800151 +46800151 2 46800152 46800124 +46800152 2 46800024 46800153 +46800153 2 46800154 24300000 +46800154 2 46800155 4100000 +46800155 2 46800115 46800156 +46800156 2 46800000 46800157 +46800157 2 46800158 13700000 +46800158 2 46800159 9500000 +46800159 2 46800160 10300000 +46800160 2 46800161 4300000 +46800161 2 46800008 46800162 +46800162 2 46800163 22900000 +46800163 2 46800164 35500000 +46800164 2 46800080 46800165 +46800165 1 28800000 + +-------------------------------------------- +16500000 +16500000 1 16500000 + +-------------------------------------------- +21100000 +21100000 2 21100000 21100001 +21100001 1 21100002 +21100002 1 21100000 + +-------------------------------------------- +25700000 +25700000 1 25700001 +25700001 2 25700000 25700002 +25700002 1 25700003 +25700003 0 + +-------------------------------------------- +SYSTEM CALLS + +12800000 label_363 +1 label_362 +19200003 label_9 +38400004 label_78 +5 label_359 +6400007 label_147 +32000010 label_328 +4600000 label_185 +32000014 label_49 +40300003 label_14 +3 label_108 +4 label_173 +6400005 label_161 +22100000 label_294 +28500001 label_356 +22100002 label_123 +34900003 label_231 +28500004 label_205 +28500005 label_53 +21600007 label_337 +19200004 label_60 +18600000 label_348 +25000001 label_106 +37800002 label_263 +37800003 label_250 +18600006 label_259 +31100006 label_271 +15100000 label_176 +8700001 label_299 +40700002 label_327 +27900003 label_66 +3800000 label_60 +9500006 label_60 +8700012 label_172 +5200000 label_309 +11600001 label_310 +11600002 label_214 +24400004 label_44 +11600008 label_79 +28600003 label_258 +48900000 label_54 +35700079 label_117 +27300000 label_184 +27300001 label_88 +27300003 label_319 +20900004 label_300 +1700005 label_137 +9500018 label_261 +19000008 label_203 +33300000 label_238 +49800001 label_237 +43000000 label_152 +18900000 label_391 +4600003 label_59 +38100001 label_136 +12200000 label_210 +9300002 label_259 +21400000 label_250 +26700000 label_173 +19500002 label_219 +31400003 label_150 +39800000 label_95 +34800000 label_179 +42400002 label_385 +42400003 label_215 +35200001 label_318 +10400007 label_142 +16800010 label_314 +42400011 label_56 +10400012 label_395 +47600002 label_102 +10400014 label_229 +44400003 label_88 +26100000 label_253 +45300002 label_83 +6900003 label_281 +6900004 label_287 +29400032 label_158 +6900006 label_14 +19700007 label_154 +19700008 label_82 +19700010 label_211 +45300014 label_243 +25200000 label_132 +41800000 label_221 +31500000 label_307 +24900008 label_24 +22600005 label_240 +37900001 label_10 +22600010 label_396 +48200000 label_310 +36400001 label_176 +12900069 label_13 +31900000 label_240 +4100001 label_227 +19100002 label_163 +19100003 label_283 +25500005 label_36 +25500006 label_103 +25500008 label_167 +12900071 label_257 +15200000 label_118 +4100002 label_15 +9200000 label_66 +41200001 label_180 +22000002 label_133 +2800003 label_122 +47600005 label_270 +29400129 label_193 +36300001 label_207 +25000002 label_285 +18600003 label_374 +31300001 label_11 +24900003 label_251 +5700004 label_125 +31300005 label_156 +24900006 label_107 +31300007 label_146 +5700008 label_268 +24900010 label_195 +24900011 label_364 +27800000 label_13 +40600001 label_166 +8600002 label_119 +29400139 label_224 +8900002 label_87 +5700003 label_54 +47300004 label_290 +18500005 label_129 +49900000 label_69 +17900001 label_245 +30700003 label_334 +37100004 label_218 +24900007 label_303 +47300008 label_182 +39900000 label_319 +1600001 label_27 +16300000 label_333 +20800006 label_132 +24800001 label_375 +5600002 label_5 +20800015 label_394 +25500000 label_154 +26300003 label_151 +42000001 label_259 +18400004 label_248 +40800005 label_221 +4500000 label_121 +17300001 label_18 +36500003 label_350 +36500009 label_336 +36500011 label_264 +13600000 label_188 +26300004 label_65 +20600009 label_326 +45800000 label_295 +7400002 label_341 +7400003 label_113 +1000005 label_303 +1000007 label_246 +21600012 label_131 +2500003 label_398 +37500004 label_370 +42300000 label_360 +48700002 label_252 +23100004 label_331 +23100005 label_36 +23100006 label_351 +29500008 label_362 +1700001 label_43 +7900007 label_81 +38500000 label_304 +45200000 label_26 +19600001 label_47 +5500011 label_343 +38800004 label_137 +6800005 label_52 +8600001 label_114 +38800008 label_210 +6800009 label_122 +6800010 label_116 +34200003 label_83 +26600000 label_334 +31000005 label_381 +35300000 label_245 +41700002 label_286 +32700032 label_224 +19300000 label_154 +38200000 label_235 +6200001 label_213 +19000002 label_21 +12600008 label_334 +46600007 label_231 +43900001 label_357 +15100001 label_240 +28300000 label_212 +41100003 label_319 +28300008 label_44 +28300011 label_348 +28300012 label_191 +24800000 label_273 +44000001 label_225 +12000002 label_314 +12000003 label_309 +31200004 label_155 +18400005 label_208 +40400001 label_349 +5600008 label_389 +5600011 label_143 +14800003 label_339 +40500000 label_23 +27700001 label_54 +2100002 label_276 +5500004 label_323 +2100005 label_313 +2100007 label_74 +46200007 label_162 +30600001 label_83 +24200002 label_358 +49800003 label_58 +43400005 label_312 +46700001 label_16 +11400008 label_396 +5000018 label_3 +43500003 label_384 +35700196 label_324 +25600001 label_165 +46300000 label_124 +7900001 label_140 +14300002 label_331 +39900003 label_85 +13100000 label_38 +39900007 label_20 +37700005 label_380 +22300000 label_78 +26900000 label_171 +23600000 label_392 +17200001 label_153 +10800002 label_7 +30000004 label_159 +36400006 label_287 +12900161 label_128 +36400008 label_134 +19600000 label_239 +1500000 label_48 +46600005 label_198 +39300001 label_217 +32900002 label_244 +39300003 label_120 +39300010 label_95 +39300011 label_288 +38000000 label_45 +15000001 label_38 +12300000 label_68 +42200000 label_79 +29400001 label_157 +29400002 label_304 +3800003 label_278 +3800005 label_344 +27400000 label_399 +3800007 label_379 +29400008 label_99 +46800033 label_199 +20900003 label_22 +29400021 label_165 +29400024 label_139 +27300004 label_48 +36100001 label_184 +47200001 label_384 +29400029 label_135 +29400030 label_218 +46800037 label_254 +45100000 label_256 +29400033 label_24 +29400034 label_207 +38700004 label_175 +38700005 label_355 +33400002 label_154 +29400051 label_155 +5000001 label_338 +22400000 label_339 +29400065 label_118 +16000002 label_343 +16000008 label_30 +14200001 label_299 +16000011 label_80 +29400083 label_90 +29400091 label_274 +28000001 label_383 +29400096 label_108 +18900001 label_109 +44500003 label_377 +12500007 label_67 +29400104 label_308 +44500009 label_353 +44500011 label_59 +29400108 label_296 +29400109 label_301 +41800001 label_371 +29400113 label_10 +29400120 label_322 +8800000 label_194 +34600001 label_111 +28200002 label_105 +45300006 label_334 +25300001 label_387 +41000006 label_172 +29400137 label_134 +34600011 label_178 +29400140 label_199 +30700004 label_78 +29400144 label_289 +4700003 label_378 +18300000 label_390 +18300001 label_222 +5500002 label_367 +11900004 label_297 +37500006 label_86 +31100008 label_21 +31100011 label_315 +45600000 label_69 +43900018 label_206 +8800002 label_218 +2000000 label_347 +8400001 label_84 +21200002 label_252 +8400003 label_191 +40400004 label_319 +46800005 label_31 +40400007 label_42 +46800010 label_334 +46800066 label_147 +46800019 label_28 +46800026 label_386 +36900000 label_85 +49700001 label_302 +24100002 label_376 +46800035 label_272 +11300005 label_37 +11300007 label_372 +24100008 label_337 +46800042 label_12 +46800071 label_35 +46800046 label_163 +46800050 label_64 +46200009 label_215 +46800056 label_310 +43100020 label_364 +46800062 label_88 +46200000 label_267 +46800065 label_291 +7800002 label_255 +33400003 label_110 +20600004 label_40 +33400005 label_350 +46200006 label_135 +26900001 label_87 +20600008 label_330 +46800073 label_4 +46800075 label_293 +35700258 label_100 +20600014 label_264 +46800083 label_247 +46800085 label_252 +46800090 label_177 +46800092 label_290 +46800094 label_126 +46800095 label_214 +4300001 label_363 +49100003 label_361 +46800102 label_108 +10700008 label_93 +46800106 label_201 +46800107 label_233 +42700012 label_1 +17100014 label_313 +46800111 label_223 +46800119 label_115 +17100030 label_344 +17100032 label_43 +33200000 label_39 +17100034 label_226 +13600003 label_100 +7200004 label_279 +39200005 label_233 +46800135 label_161 +13600008 label_227 +17100041 label_362 +13600011 label_281 +46800140 label_230 +7200013 label_161 +46800142 label_358 +46800144 label_378 +700003 label_117 +7200020 label_183 +46800150 label_200 +46800151 label_238 +39400000 label_347 +35700000 label_70 +35700002 label_391 +42100003 label_283 +35700004 label_375 +35700005 label_203 +3700006 label_200 +35700010 label_245 +12900233 label_174 +32100000 label_26 +35700028 label_280 +35700029 label_167 +45000000 label_192 +6600002 label_66 +32200003 label_204 +45000004 label_17 +35700038 label_105 +49100001 label_141 +25800009 label_89 +35700051 label_50 +35700055 label_65 +35700056 label_307 +28700000 label_23 +9500002 label_152 +35700070 label_328 +9500008 label_51 +35700074 label_209 +9500015 label_165 +38600000 label_340 +46800104 label_244 +35700082 label_397 +35700085 label_370 +35700091 label_205 +35700092 label_48 +17100010 label_242 +35700096 label_188 +38000001 label_303 +38000003 label_149 +36200001 label_40 +35700104 label_178 +46800108 label_321 +35700108 label_35 +35700109 label_19 +35700110 label_363 +35700111 label_172 +35700115 label_316 +35700118 label_279 +35700119 label_331 +35700121 label_121 +35700122 label_165 +9900000 label_171 +28100000 label_222 +2500002 label_242 +8900003 label_131 +15300004 label_324 +22100001 label_270 +35700134 label_155 +35700136 label_321 +47300009 label_367 +35700139 label_177 +35700140 label_206 +35700145 label_130 +28200001 label_333 +35700149 label_263 +35700151 label_237 +5400000 label_148 +35700161 label_235 +18200003 label_29 +11800005 label_219 +35700167 label_393 +14800001 label_394 +35700169 label_168 +17100023 label_253 +16900002 label_120 +35700188 label_293 +15700001 label_113 +27500000 label_382 +21100001 label_105 +40300002 label_219 +8300003 label_237 +46700004 label_139 +46700005 label_335 +35700198 label_95 +33900007 label_265 +35700208 label_21 +23300000 label_251 +39700000 label_100 +35700217 label_152 +35700223 label_167 +36800000 label_285 +26400000 label_380 +35700226 label_226 +35700227 label_150 +49600007 label_52 +49600008 label_198 +7200003 label_25 +42400004 label_379 +35700250 label_56 +1300000 label_310 +39700001 label_150 +33300002 label_387 +11300000 label_354 +15900000 label_76 +17000000 label_186 +23400001 label_89 +49000002 label_122 +42600005 label_35 +26300002 label_55 +42400013 label_174 +45500003 label_16 +32700004 label_1 +26300000 label_260 +45500001 label_145 +39100002 label_317 +39100003 label_2 +700004 label_146 +700006 label_396 +26300008 label_288 +13500014 label_305 +32700015 label_12 +13500016 label_78 +32700017 label_312 +9400004 label_326 +32700029 label_342 +22800000 label_68 +35600001 label_153 +3600002 label_329 +45400001 label_197 +42000008 label_55 +16600003 label_352 +24300000 label_238 +28900000 label_295 +16600005 label_158 +44900000 label_170 +32700016 label_376 +32100002 label_396 +12900003 label_96 +12900004 label_304 +29400006 label_132 +32100006 label_292 +32100007 label_117 +32100009 label_50 +12900010 label_87 +29400007 label_375 +12900014 label_272 +12900024 label_37 +12900029 label_107 +12900031 label_38 +41400000 label_71 +42100000 label_368 +22200002 label_201 +12900035 label_222 +3000004 label_261 +37600000 label_332 +28600007 label_161 +7200016 label_337 +12900048 label_282 +12900049 label_190 +26100004 label_48 +12900062 label_368 +12900063 label_57 +25100000 label_169 +31500001 label_399 +5900003 label_268 +25100005 label_216 +25100007 label_371 +12900073 label_222 +5900010 label_272 +26100007 label_345 +5900013 label_135 +24300003 label_4 +12900080 label_58 +500008 label_70 +12900088 label_373 +12900090 label_137 +12900091 label_254 +2400000 label_143 +37300000 label_12 +40800000 label_22 +12900097 label_98 +12900098 label_341 +12900100 label_391 +15200005 label_232 +38800001 label_339 +21600008 label_269 +12900108 label_21 +10000002 label_254 +12900113 label_121 +12900124 label_162 +12900125 label_241 +12900127 label_352 +11700000 label_202 +12900129 label_92 +6300006 label_388 +41900001 label_81 +12900133 label_182 +12900135 label_382 +12900145 label_32 +12900148 label_217 +12800003 label_346 +12900152 label_141 +19600010 label_346 +40200000 label_176 +46600001 label_199 +46600002 label_154 +8200003 label_374 +12900165 label_46 +14600007 label_340 +13100002 label_15 +12900174 label_231 +32700003 label_325 +12900181 label_249 +48400001 label_245 +12900190 label_137 +12900191 label_202 +4700000 label_91 +49500001 label_394 +12900194 label_314 +23900003 label_389 +4700004 label_76 +12900200 label_323 +43100010 label_129 +43100011 label_234 +20000000 label_377 +12900211 label_19 +12900212 label_55 +13500002 label_123 +43100023 label_373 +12900216 label_364 +12900221 label_159 +20400000 label_114 +12900225 label_249 +12900227 label_298 +46000005 label_332 +15400001 label_307 +3400001 label_77 +46000009 label_39 +27300005 label_197 +12900236 label_353 +46000014 label_358 +12900240 label_284 +12900241 label_310 +47600000 label_30 +12900245 label_177 +12900246 label_320 +21900000 label_368 +12900255 label_281 +4100000 label_21 +12900257 label_354 +23300002 label_369 +36100003 label_44 +36100005 label_69 +23300006 label_120 +16900007 label_386 +12900265 label_87 +23300010 label_179 +12900271 label_354 +12900278 label_168 +26200000 label_164 +32600001 label_212 +45400002 label_312 +32600004 label_164 +12900294 label_266 +25000000 label_306 +12900296 label_159 +12900297 label_58 +12900300 label_105 +12900301 label_360 +12900303 label_346 +28400000 label_326 +32100003 label_35 +12900308 label_236 +12900310 label_250 +12900311 label_158 +12900312 label_295 +12900318 label_64 +48300000 label_366 +16300001 label_308 +16300003 label_102 +3500004 label_196 +9900005 label_382 +3500006 label_261 +16300008 label_355 +16300009 label_275 +12900333 label_311 +3500021 label_88 Index: test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/node.h =================================================================== --- test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/node.h +++ test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/node.h @@ -0,0 +1,159 @@ +/************************************************************************* + * + * PathFinder: finding a series of labeled nodes within a + * two-layer directed, cyclic graph. + * Copyright (2013) Sandia Corporation + * + * Copyright (2013) Sandia Corporation. Under the terms of Contract + * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government + * retains certain rights in this software. + * + * This file is part of PathFinder. + * + * PathFinder is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * PathFinder is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with PathFinder. If not, see . + * + * Questions? Contact J. Brian Rigdon (jbrigdo@sandia.gov) + * + */ + +/* + * node.h + * + * Created on: Feb 1, 2013 + * Author: Brian "Rig" Rigdon, Marcus Smith, Samuel Mulder + */ + +#ifndef NODE_H_ +#define NODE_H_ + + + + +/* -------- + * Nodes are the basic data structure within the graph. Nodes hold information + * regarding their identity (id, label, type, etc.) and information about their + * edges (list of edges, number of edges). + * + * Node.h/.c contains the data definitions for nodes and edges as well as con- + * tainers for nodes (NodeList, NodePtrVec) and edges (EdgeList) + */ + + + + +typedef enum +{ + exteriorNode, /* Default unless Node_setParent is called */ + interiorNode, + entranceNode /* special interior node(s) that begin the interior graph */ +} NodeType; + + +/* ------------------------------------------- + * Node Definitions + * + */ + + + +typedef struct NodeStruct Node; +typedef struct NodeListStruct NodeList; +typedef struct EdgeListStruct EdgeList; + +#include "bitfield.h" +#include "vectorUtils.h" +#include + +struct NodeStruct +{ + int id; /* id value for the node - typically associated with an address of the basic block */ + int nodeCount; /* a unique index for this node (0 .. whatever) */ + char *label; + int labelIdx; + NodeType type; + Node *container; /* if this is an interior node, this points to the outer node containing this one */ + NodeList *interiorNodes; /* All the nodes contained in this node's subgraph */ + EdgeList *edges; /* Nodes that can be accessed from this node (includes entrance nodes) */ + + int edgeCount; /* edges from this node to others (DOES NOT INLCUDE INTRANCE NODES) */ + int entranceCount; /* number of entrance nodes (if any) */ +}; + +/* "methods" for nodes */ + +Node *Node_new( int id, int nodeCount ); /* Constructor */ +void Node_delete( Node *trash ); /* Destructor */ +Node *Node_duplicate(Node *from, int newIndex); /* Duplicates node data, BUT NO EDGE INFORMATION */ +void Node_setParent( Node *this, Node *parent ); /* Identifies the Upper-level node containing inner level node */ +void Node_addInteriorNode( Node *this, Node *interior ); /* Inserts interior node into parent list */ +bool Node_addEdgeToNode(Node *this, Node *node); /* Node* based insertion method */ + + +/* ------------------------------------------- + * Node List Definitions + * + */ + +struct NodeListStruct +{ + Node *node; + NodeList *nextNode; +}; + +/* "methods" for NodeLists */ + +NodeList *NodeList_new(); /* Constructor */ + +/* Destructor - also frees the data allocated for nodes if freeMemory is + * true (calls their "destructor ) + */ +void NodeList_clear( NodeList *trash, bool deleteNodes ); + +/* insertFront modifies the list passed in such that the first element + * points to the new node. This is done by duplicating the first element + * into a new element, and then modifying the true first element to point + * to the node passed and and the created element (which references the + * rest of the list). + */ +bool NodeList_insertFront( NodeList *this, Node *newFront ); +/* Create a new node list element, have it reference the node passed in + * and then put it in the back of the list. Returns true on success + */ +bool NodeList_insertBack( NodeList *this, Node *newBack ); + +/* ------------------------------------------- + * Edge List Definitions + * + * Edges are processed a little differently than nodes. As soon as a + * node is identified, it is created. However, the edges may be + * identified prior to the creation of the node to which it references. + * Ergo, there's a two pass process - first identifying the edges, + * then subsequently setting the pointers to reference them. + * + * Rather than making a dual structure "Edge" and "EdgeList" pair, + * the author is combining the data into a single structure. + */ + +struct EdgeListStruct +{ + int targetNodeId; + Node *targetNode; + EdgeList *nextEdge; +}; + +EdgeList *EdgeList_new(); /* Constructor */ +void EdgeList_clear(EdgeList* this); /* Destructor */ +bool EdgeList_insertNodeId(EdgeList *this, int targetNodeId); /* Id based insertion method */ + +#endif /* NODE_H_ */ Index: test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/node.c =================================================================== --- test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/node.c +++ test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/node.c @@ -0,0 +1,364 @@ +/************************************************************************* + * + * PathFinder: finding a series of labeled nodes within a + * two-layer directed, cyclic graph. + * Copyright (2013) Sandia Corporation + * + * Copyright (2013) Sandia Corporation. Under the terms of Contract + * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government + * retains certain rights in this software. + * + * This file is part of PathFinder. + * + * PathFinder is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * PathFinder is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with PathFinder. If not, see . + * + * Questions? Contact J. Brian Rigdon (jbrigdo@sandia.gov) + * + */ + +/* + * node.c + * + * Created on: Feb 1, 2013 + * Author: Brian "Rig" Rigdon, Marcus Smith, Samuel Mulder + */ + +/* -------- + * Nodes are the basic data structure within the graph. Nodes hold information + * regarding their identity (id, label, type, etc.) and information about their + * edges (list of edges, number of edges). + * + * Node.h/.c contains the data definitions for nodes and edges as well as con- + * tainers for nodes (NodeList, NodePtrVec) and edges (EdgeList) + */ + +#include +#include +#include +#include "node.h" +#include "graph.h" + + +/* ------------------------------------------- + * Node Method Definitions + * + */ + +/* "methods" for nodes */ +/* Constructor */ +Node *Node_new(int id, int nodeCount) +{ + Node *node = malloc(sizeof(Node)); + + if ( !node ) + return(NULL); + + node->id = id; + node->nodeCount = nodeCount; /* index into bitfield - caller must increment! */ + node->label = NULL; + node->labelIdx = -1; + node->type = exteriorNode; + node->container = NULL; + node->interiorNodes = NULL; + node->edges = NULL; + + node->edgeCount = 0; + node->entranceCount = 0; + + return(node); +} + +/* Destructor */ +void Node_delete(Node *trash) +{ + /* Some basic error checking */ + if ( !trash ) return; + + if ( trash->interiorNodes ) /* "true" tells clearNodeList to free the mallocs */ + NodeList_clear( trash->interiorNodes, true ); + + if ( trash->edges ) + EdgeList_clear( trash->edges ); + + free( trash ); +} + +/* Duplicates node data, BUT NO EDGE INFORMATION */ +Node *Node_duplicate(Node *from, int newIndex) +{ + Node *copy = malloc(sizeof(Node)); + + if ( !copy || !from ) + return(NULL); + + copy->id = from->id; + copy->nodeCount = newIndex; /* index into bitfield - caller must increment! */ + copy->label = from->label; + copy->labelIdx = from->labelIdx; + copy->type = from->type; + copy->container = NULL; + copy->interiorNodes = NULL; + copy->edges = NULL; + + copy->edgeCount = 0; + copy->entranceCount = 0; + + return(copy); +} + +/* Identifies the Upper-level node containing inner level node */ +void Node_setParent(Node *this, Node *parent) +{ + /* Some basic error checking */ + if ( !this || !parent ) + return; + + this->container = parent; + this->type = interiorNode; +} + +/* Inserts interior node into parent list */ +void Node_addInteriorNode(Node *this, Node *interior) +{ + /* some basic error checking */ + if ( !this || !interior ) + return; + + if ( this->interiorNodes == NULL ) + { + this->interiorNodes = NodeList_new(); + if ( this->interiorNodes == NULL ) + return; /* malloc failed */ + this->interiorNodes->node = interior; + } + else + NodeList_insertBack(this->interiorNodes, interior); + + Node_setParent(interior, this); + return; +} + + +/* adds an edge from "this" to "node. If an allocation error occurs + * this method returns false. If an edge already exists, the method + * will NOT add a duplicate edge, and will return true. + */ +bool Node_addEdgeToNode(Node *this, Node *node) +{ + EdgeList *end = NULL; + EdgeList *newEdge = NULL; + + if ( !this || !node ) + return(false); + + /* Scream through the list and make sure edge doesn't already exist */ + for ( end = this->edges; end != NULL; end = end->nextEdge ) + if ( end->targetNode == node ) + return true; + + /* Otherwise, we have a new edge. Insert it at the head of the list */ + newEdge = EdgeList_new(); + if ( !newEdge ) /* allocation error */ + return false; + newEdge->targetNode = node; + newEdge->targetNodeId = node->id; + newEdge->nextEdge = this->edges; /* First time, this is NULL, terminates our list. */ + this->edges = newEdge; + ++this->edgeCount; + return(true); +} + + +/* ------------------------------------------- + * NodeList Method Definitions + * + */ + +/* Constructor */ +NodeList * NodeList_new() +{ + NodeList *list = malloc(sizeof(NodeList)); + + if ( !list ) + return(NULL); + + list->node = NULL; + list->nextNode = NULL; + + return(list); +} + +/* Destructor - also frees the data allocated for nodes if freeMemory is + * true (calls their "destructor ) + */ +void NodeList_clear(NodeList *trash, bool deleteNodes) +{ + /* Some basic error checking */ + if ( !trash ) return; + + if ( trash->nextNode ) + NodeList_clear(trash->nextNode, deleteNodes); + + if ( deleteNodes ) + { + Node_delete(trash->node); + } + free(trash); +} + +/* insertFront modifies the list passed in such that the first element + * points to the new node. This is done by duplicating the first element + * into a new element, and then modifying the true first element to point + * to the node passed and and the created element (which references the + * rest of the list). + */ +bool NodeList_insertFront(NodeList *this, Node *newFront) +{ + /* Make a new element that holds the information that used to + * be at the front. + */ + NodeList *oldFront = NodeList_new(); + + /* Some basic error checking */ + if ( !this || !newFront || !oldFront ) + return(false); + + /* move the formerly front data to the new element */ + oldFront->node = this->node; + oldFront->nextNode = this->nextNode; /* Now points to the remainder of the list (or NULL) */ + + /* And change the head element to reference the new front node. */ + this->node = newFront; + this->nextNode = oldFront; + + return(true); +} + +/* Create a new node list element, have it reference the node passed in + * and then put it in the back of the list. Returns true on success + */ +bool NodeList_insertBack(NodeList *this, Node *newBack) +{ + NodeList *end; + NodeList *newElement; + + /* Some basic error checking */ + if ( !this || !newBack ) + return(false); + + /* If the node portion of "this" is null, + * then we're starting with an empty list. + */ + + if ( this->node == NULL ) + { + this->node = newBack; + return(true); /* We're done! */ + } + + /* Otherwise, we need to find the end of the list */ + for ( end = this; end->nextNode != NULL; end = end->nextNode ) + { /* No-op */ } + + newElement = NodeList_new(); + if ( !newElement ) + return(false); + + newElement->node = newBack; + end->nextNode = newElement; /* new nodelist element has a null next */ + + return(true); +} + + + + + +/* ------------------------------------------- + * Edge List Method Definitions + * + */ + +/* Constructor */ +EdgeList *EdgeList_new() +{ + EdgeList *newNode = malloc( sizeof( struct EdgeListStruct )); + if ( newNode ) + { + newNode->targetNodeId = -1; /* Potentially a bug. what if there's a node named -1? */ + newNode->targetNode = NULL; + newNode->nextEdge = NULL; + } + return(newNode); +} + +/* Destructor */ +void EdgeList_clear( EdgeList *this ) +{ + /* Some basic error checking */ + if ( !this ) + return; + + if ( this->nextEdge ) + EdgeList_clear(this->nextEdge); + + free(this); +} + +/* Insertion Method + * It is important to realize that this inserts the edge as an Id, it does + * not find or initialize the node specified by that Id. That has to be + * done as a separate step later. + */ +bool EdgeList_insertNodeId(EdgeList *this, int targetNodeId) +{ + EdgeList *end; + EdgeList *newElement; + + /* some basic error checking */ + if ( !this ) + return(false); + + /* Check to see if this is the initial insertion into the + * Edge list + */ + if ( this->targetNodeId == -1 ) + { + this->targetNodeId = targetNodeId; + return(true); + } + + /* Otherwise we find the end of the list and make a new entry */ + for ( end = this; end->nextEdge != NULL; end = end->nextEdge ) + { /* No-op */ } + + newElement = EdgeList_new(); + if ( !newElement ) + return(false); + + newElement->targetNodeId = targetNodeId; + end->nextEdge = newElement; /* new edge list element has a null node and next */ + + return(true); +} + + + + + + + + + +/* Search Algorithms */ Index: test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/parsing.h =================================================================== --- test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/parsing.h +++ test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/parsing.h @@ -0,0 +1,114 @@ +/************************************************************************* + * + * PathFinder: finding a series of labeled nodes within a + * two-layer directed, cyclic graph. + * Copyright (2013) Sandia Corporation + * + * Copyright (2013) Sandia Corporation. Under the terms of Contract + * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government + * retains certain rights in this software. + * + * This file is part of PathFinder. + * + * PathFinder is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * PathFinder is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with PathFinder. If not, see . + * + * Questions? Contact J. Brian Rigdon (jbrigdo@sandia.gov) + * + */ + + +/* + * parsing.h + * + * Created on: Jan 9, 2013 + * Author: Brian "Rig" Rigdon, Marcus Smith, Samuel Mulder + */ + +/* -------- + * This pair of files contains the utility data types and methods for + * parsing data files into graphs. It also defines a "configuration" + * for a given run of PathFinder. The configuration holds all the info + * corresponding to the run - graphs, signatures, search types. + */ + +#ifndef PARSING_H_ +#define PARSING_H_ + +#include "vectorUtils.h" + +/* Since we're parsing into graphs, we need to know what they are... */ +#include "graph.h" +#include "configuration.h" + + + +/* buildEntranceList takes an array of integers, and builds a + * non-resolved edge list from the array. This is a special + * edge list, used only be outer nodes to identify entrance + * points into their subgraph. + */ +void buildEntranceList( Node *outerNode, IntVector *nodeData ); + + +/* buildNodeFromData takes the integer array built by the above + * method, and creates a node from it. If that node has + * edge data, that is also built. The data is in an array, + * the size of which is also passed in. + */ +Node *buildNodeFromData( IntVector *nodeData ); + + +/* resolveNodeEdges is the second pass through the graph data + * structures. The first pass defines the nodes, and puts the edge + * ids in place. The second pass finds the nodes corresponding to + * the edge id, and sets the edge pointer to that node. Edges for + * outer nodes will only reference other outer nodes. Interior + * nodes may have edges to outer nodes or other interior nodes of + * their containing node. If an edge references an undefined node + * or if an edge goes into the interior of another outer node, + * the user will be notified. + */ +void resolveNodeEdges( Graph *graph, Node *sourceNode, bool outerNode ); + + + +/* parseFile goes through the specified file to build the graph. It + * returns true if everything goes as planned. Any errors will cause + * false to be returned. The built graph can be accessed via + * Graph_the(). + */ + +Graph *parseFile( char *fileName ); + +/* parseSignature takes a space delimited string and turns it + * into a "signature" - a packed array of c-string pointers with + * a NULL pointer to signify completion. As with our edge parser + * the code depends on a space character to terminate the line. + */ +char **parseSignature( char *data ); + +/* parseConfigFile reads the data file names and desired search + * signatures from the config file. It returns a packed array + * of Graph pointers populated corresponding to the data files. + * Also, it returns a packed array of pointers to signatures. + * (Signatures are themselves packed arrays to C-Strings.) These + * packed arrays are terminated with a NULL pointer. They + * are returned in the "graphs" and "signatures" parameters + * which should be references to the desired pointers. See main.c. + */ +bool parseConfigFile( char *configFileName, Configuration *config ); + + + +#endif /* PARSING_H_ */ Index: test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/parsing.c =================================================================== --- test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/parsing.c +++ test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/parsing.c @@ -0,0 +1,678 @@ +/************************************************************************* + * + * PathFinder: finding a series of labeled nodes within a + * two-layer directed, cyclic graph. + * Copyright (2013) Sandia Corporation + * + * Copyright (2013) Sandia Corporation. Under the terms of Contract + * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government + * retains certain rights in this software. + * + * This file is part of PathFinder. + * + * PathFinder is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * PathFinder is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with PathFinder. If not, see . + * + * Questions? Contact J. Brian Rigdon (jbrigdo@sandia.gov) + * + */ + + +/* + * graph.c + * + * Created on: Jan 9, 2013 + * Author: Brian "Rig" Rigdon, Marcus Smith, Samuel Mulder + */ + +#include "parsing.h" +#include "graph.h" +#include "utils.h" +#include "systemCallMap.h" +#include "yaml.h" + + +#include + + +/* buildEntranceList takes an array of integers, and builds a + * non-resolved edge list from the array. This is a special + * edge list, used only be outer nodes to identify entrance + * points into their subgraph. Only the edge data is passed in, + * this begins with the second entry (index 1) in the parsed + * data array. Likewise the size only counts edges. + * + * Initially, entrance transitions were handled as a separate + * list of edges. After further analysis, however, there is + * no operational difference between outer edges and entrance + * edges. Ergo, we are modifying this code to put the entrance + * edges into the edge list and deprecating the entrance list. + * The code is being left in for the time being as comments, + * since there are some contextual significances to interior + * nodes and entrance edges that may later be required. Otherwise + * we could go to a simple flat graph. + */ +void buildEntranceList( Node *outerNode, IntVector *nodeData ) +{ + int i; + int entranceCount; + + /* some basic error checking */ + if ( !outerNode || !nodeData ) return; + + entranceCount = nodeData->vector[1]; /* count is the first entry, (second of original data); */ + if ( entranceCount == 0 ) + return; /* Nothing to see here, folks */ + + if ( entranceCount != nodeData->size-2 ) + { + fprintf ( stderr, "Specified entrance edge length does not match data size for node: %d\n", + outerNode->id ); + } + + /* Deprecated: outerNode->entranceNodes = EdgeList_new(); */ + /* Deprecated: if ( outerNode->entranceNodes ) */ + if ( !outerNode->edges ) + outerNode->edges = EdgeList_new(); + if ( outerNode->edges ) + for ( i = 2; i < nodeData->size; ++i ) + { + /* Deprecated EdgeList_insertBack( outerNode->entranceNodes, edgeData[i] ); */ + EdgeList_insertNodeId( outerNode->edges, nodeData->vector[i] ); + ++outerNode->entranceCount; + } +} + + +/* buildNodeFromData takes the integer array built by the above + * method, and creates a node from it. If that node has + * edge data, that is also built. The data is in an array, + * the size of which is also passed in. + */ +Node *buildNodeFromData( IntVector *nodeData ) +{ + int i; + int edgeCount; + + /* some basic error checking */ + if ( nodeData == NULL || nodeData->size == 0 ) + return( NULL ); + + Node *node = Node_new( nodeData->vector[0], -1 ); /* Calling method must set index. */ + if ( !node ) + return( NULL ); + + /* Currently, the second element in is the edge count */ + edgeCount = nodeData->vector[1]; + if ( edgeCount != nodeData->size-2 ) + { + fprintf ( stderr, "Specified edge length does not match data size for node: %d\n", + nodeData->vector[0] ); + } + + if ( edgeCount > 0 ) + { + node->edges = EdgeList_new(); + if ( node->edges ) + for ( i = 2; i < nodeData->size; ++i ) + { + EdgeList_insertNodeId ( node->edges, nodeData->vector[i] ); + ++node->edgeCount; + } + } + + return( node ); +} + + +/* resolveNodeEdges is the second pass through the graph data + * structures. The first pass defines the nodes, and puts the edge + * ids in place. The second pass finds the nodes corresponding to + * the edge id, and sets the edge pointer to that node. Edges for + * outer nodes will only reference other outer nodes. Interior + * nodes may have edges to outer nodes or other interior nodes of + * their containing node. If an edge references an undefined node + * or if an edge goes into the interior of another outer node, + * the user will be notified. + * + * Note: The section that resolves entrance edges has been commented + * out because entrance edges are now processed as part of the edge + * list. + */ +void resolveNodeEdges( Graph *graph, Node* sourceNode, bool outerNode ) +{ + EdgeList *edges; + Node *node; + bool okSoFar; + + for ( edges = sourceNode->edges; edges != NULL; edges = edges->nextEdge ) + { + if ( outerNode ) + { + /* We only check for edges to other outer nodes*/ + node = Graph_findNode( graph, edges->targetNodeId, true ); /* true-> check outer and interior nodes */ + if ( node ) + { + okSoFar = true; + /* Since entrance edges are now part of our edge list, we have to make sure + * the link here is appropriate. + */ + if ( node->type == entranceNode || node->type == interiorNode ) + { + if ( node->container != sourceNode ) + { + fprintf( stderr, + "resolveNodeEdges: Outer node %d edge to non-contained node: %d\n", + sourceNode->id, edges->targetNodeId ); + fprintf(stderr, "\t%d is type: %s (%d)\n", node->id, node->type == interiorNode ? "interior" : "entrance", (int)node->type); + okSoFar = false; + } + } + if ( okSoFar ) + edges->targetNode = node; + } + else + fprintf( stderr, + "resolveNodeEdges: Outer node %d has edge reference to undefined node: %d\n", + sourceNode->id, edges->targetNodeId ); + } + else + { + /* Interior node - the edge can be to an outer node... */ + node = Graph_findNode( graph, edges->targetNodeId, false ); /* false-> only check outer nodes */ + if ( node ) + edges->targetNode = node; + else + { + /* ... or nodes interior to the container of this node */ + node = Graph_findContainedNode( sourceNode->container, edges->targetNodeId ); + if ( node ) + edges->targetNode = node; + else + { + /* we have an undefined node */ + fprintf( stderr, + "resolveNodeEdges: Interior node %d has edge reference to undefined node: %d\n", + sourceNode->id, edges->targetNodeId ); + } + } + } + } + +} + + +/* pruneLine takes the \r\n off the end of the label. This is an artifact of + * the windows file system, not something that was intended to be a part + * of the actual label string. + */ +static void pruneLine( char *label ) +{ + int i = 0; + + for ( ; label[i] != '\0'; ++i ) + { + if ( label[i] == '\r' ) + { + label[i] = '\0'; + return; + } + if ( label[i] == '\n' ) + { + label[i] = '\0'; + return; + } + } +} + +/* parseFile goes through the specified file to build the graph. It + * returns a pointer to the graph instance created by the data. Otherwise + * it returns NULL if the file is not parsable. + */ + +Graph *parseFile( char *fileName ) +{ + FILE *inFile; + IntVector *fileData = NULL; + CharVector *fileString = NULL; + Node *newNode = NULL; + Node *outerNode = NULL; + Node *findNode = NULL; + int temp, count; + NodeList *outerNodeList = NULL; + NodeList *innerNodeList = NULL; + Graph *newGraph = NULL; + int funcCount = 50; /* used as a default initial size for the system call table */ + int blockCount = 0; + bool systemCallSection = false; + int i; + + /* A little error checking */ + if ( !fileName ) + return( NULL ); + +#ifdef PRINT_FILE + printf ( "Parsing file %s...\n", fileName ); +#endif + + inFile = fopen( fileName, "r" ); + if ( !inFile ) + { + printf( "Could not open data file: %s (parsing.c:parseFile)\n", fileName ); + return( NULL ); + } + /* else + printf( "Opened %s\n\n", fileName ); */ + + newGraph = Graph_new(); + if ( !newGraph ) + return( NULL ); + + newGraph->fileName = strdup( fileName ); + fileString = CharVector_new( 1024 ); /* allocate our data parsing storage - 1024 is a semi-arbitrary power of 2 */ + + i = 0; + + /* The first two lines define the number of Functions and basic blocks. */ + CharVector_getLineFromFile( fileString, inFile ); + if ( !feof( inFile ) && ( strncmp ( "Functions:", fileString->string, 10 ) == 0 ) ) + { + funcCount = atoi ( fileString->string+10 ); + printf ( "\t%d functions specified\n", funcCount ); + YAMLWriteInt("Functions", funcCount); + } + else + { + fprintf ( stderr, "Malformed file, Function count not specified in first line\n" ); + return( NULL ); + } + + CharVector_getLineFromFile( fileString, inFile ); + if ( !feof( inFile ) && ( strncmp ( "Basic blocks:", fileString->string, 13 ) == 0 ) ) + { + blockCount = atoi ( fileString->string+13 ); + printf ( "\t%d basic blocks specified\n", blockCount ); + YAMLWriteInt("Basic Blocks", blockCount); + } + else + { + fprintf ( stderr, "Malformed file, Function count not specified in first line\n" ); + return( NULL ); + } + + // printf ("Done with header\n"); + + fileData = IntVector_new( 8 ); /* allocate our data parsing storage - 8 is a semi-arbitrary power of 2 */ + + /* + * The first section defines the outer nodes. Scan through it to identify the + * nodes and to do the first pass of edge definition. + */ + while ( !feof( inFile ) ) /* clumsy use of feof */ + { + CharVector_getLineFromFile( fileString, inFile ); + + if ( feof( inFile ) ) /* that read line was the last line */ + break; + + if ( strncmp( "----------", fileString->string, 10 ) == 0 ) /* we have a section break */ + break; + + count = IntVector_createFromString ( fileData, fileString->string ); + + if ( count > 0 ) + { + // printf("processing node %d\n", fileData->vector[0] ); + newNode = buildNodeFromData( fileData ); + if ( newNode ) + { + Graph_addOuterNode( newGraph, newNode ); + newNode->nodeCount = newGraph->totalNodes; + newGraph->totalNodes += 1; + } + } + IntVector_clear( fileData ); + } + + //printf ("Done with outer nodes\n"); + + /* Parse the subsequent sections to get the inner nodes */ + while ( !feof( inFile ) ) + { + /* The first line will identify the outer node for which the inner nodes are defined. */ + CharVector_getLineFromFile( fileString, inFile ); + + if ( feof( inFile ) ) /* that fgets was the last line */ + break; + + systemCallSection = strncmp( "SYSTEM CALLS", fileString->string, 12) == 0; + if ( systemCallSection ) + break; + + if ( isdigit( (int)fileString->string[0] ) ) + temp = atoi( fileString->string ); /* Note: No format error check here... */ + else + temp = -1; /* Man, I hope -1 is never a node id value... */ + outerNode = Graph_findNode( newGraph, temp, false ); /* false -> only check outer nodes */ + + if ( outerNode == NULL ) + { + fprintf (stderr, "Error in parseFile: Node %d undefined as an outer node\n", temp ); + break; /* No error recovery - but continue with the program */ + } + + /* Now, subsequent lines (up to the section break) identify interior nodes; */ + while ( !feof( inFile ) ) + { + CharVector_getLineFromFile( fileString, inFile ); + + if ( strncmp( "----------", fileString->string, 10 ) == 0 ) /* we have a section break */ + break; + + count = IntVector_createFromString( fileData, fileString->string ); + if ( count > 0 ) + { + /* + * special case: If the node specified is the outerNode, the edge nodes specified + * here are the entrance nodes + */ + if ( fileData->vector[0] == outerNode->id ) + buildEntranceList( outerNode, fileData ); + else + { + newNode = buildNodeFromData( fileData ); + if ( newNode ) + { + Node_addInteriorNode( outerNode, newNode ); + newNode->nodeCount = newGraph->totalNodes; + newGraph->totalNodes += 1; + } + } + } + IntVector_clear( fileData ); + } + } + + //printf ( "Done with interior nodes. On to System Calls\n" ); + + /* All the node mappings have been done, now we build a map of system calls to the + * node keys. + */ + newGraph->systemCallMap = SystemCallMap_new( funcCount ); + if ( newGraph->systemCallMap == NULL ) + { + IntVector_delete( fileData ); + return( NULL ); /* if we can't build the system call map, we're done. */ + } + + if ( systemCallSection ) + { + while ( !feof( inFile ) ) + { + CharVector_getLineFromFile( fileString, inFile ); + + if ( feof( inFile ) ) /* that fgets was the last line */ + break; + + if ( isdigit( (int)fileString->string[0] ) ) + temp = atoi ( fileString->string ); /* get the key */ + else + temp = -1; + if ( temp >= 0 ) /* valid key */ + { + /* get the system call name. First, get past the ' ' */ + for ( i = 0; fileString->string[i] != '\0' && fileString->string[i] != ' '; ++i ) {} + if ( fileString->string[i] == ' ' ) + { + ++i; + findNode = Graph_findNode( newGraph, temp, true ); + pruneLine( fileString->string+i ); + SystemCallMap_insert( newGraph->systemCallMap, fileString->string+i, findNode ); + } + } + } + } /* ....aaaand we're done parsing the input file. */ + + CharVector_delete(fileString); + + //printf ( "Done parsing, resolve edges\n" ); + /* Now that we have all the nodes, resolve all edge definitions */ + for ( outerNodeList = newGraph->outerNodes; + outerNodeList != NULL; + outerNodeList = outerNodeList->nextNode ) + { + resolveNodeEdges( newGraph, outerNodeList->node, true ); /* true -> outer node */ + for ( innerNodeList = outerNodeList->node->interiorNodes; + innerNodeList != NULL; + innerNodeList = innerNodeList->nextNode ) + { + resolveNodeEdges( newGraph, innerNodeList->node, false ); /* false -> interior node */ + } + } + + + /* How many nodes did we count (outer + interior)? + printf ( "\tTotal nodes parsed: %d\n", newGraph->totalNodes ); */ + + /* Debug --* / + graphPrettyPrint( newGraph ); + systemCallMapPrettyPrint( newGraph->systemCallMap ); + / *-- End Debug */ + + printf( "\t%d total System Call Map elements\n", newGraph->systemCallMap->contentSize ); + YAMLWriteInt( "System Calls", newGraph->systemCallMap->contentSize ); + + /* Build the search diagram */ + newGraph->searchDiagram = SearchDiagram_build( newGraph->outerNodes, newGraph->totalNodes ); + + printf ( "\t...parsing complete.\n" ); + return( newGraph ); +} + + + + +/* parseSignature takes a space delimited string and turns it + * into a "signature" - a packed array of c-string pointers with + * a NULL pointer to signify completion. + */ +char **parseSignature( char *data ) +{ + int i = 0; + int labelCount = 0; // Used to be 1. The algorithm depends on a terminating space, so it counts based on the END of the label. + int copiedLabels = 0; + char **labels = NULL; + char *debug = NULL; + + /* A little error checking */ + if ( !data ) + return NULL; + + /* First, scream through the array counting labels */ + for( i = 0; data[i] != '\0'; ++i ) + { + if ( data[i] == ' ' ) + { + ++labelCount; + data[i] = '\0'; + } + } + + /* Now, allocate the array and make copies */ + labels = (char **)malloc( (labelCount+1) * sizeof(char*) ); + i = 0; + if ( labels ) + { + for ( copiedLabels = 0; copiedLabels < labelCount; ++copiedLabels ) + { + debug = &data[i]; + labels[copiedLabels] = strdup( &data[i] ); + while ( data[i] != '\0' ) + { + /* advance to the end of this label */ + ++i; + } + ++i; /* advance beyond the \0 to the start of the next label */ + } + labels[labelCount] = NULL; /* terminate the array */ + } + + /* Debug print out * / + printf ( "\nSignature: "); + for ( i = 0; labels[i] != NULL; ++i ) + { + printf ( "%s ", labels[i] ); + } + /* end Debug */ + + return labels; +} + + + + + +/* parseConfigFile reads the data file names and desired search + * signatures from the config file. It returns a packed array + * of Graph pointers populated corresponding to the data files. + * Also, it returns a packed array of pointers to signatures. + * (Signatures are themselves packed arrays to C-Strings.) These + * packed arrays are terminated with a NULL pointer. They + * are returned in the "graphs" and "signatures" parameters + * which should be references to the desired pointers. See main.c. + */ +bool parseConfigFile( char *configFileName, Configuration *config ) +{ + char data[1000]; + FILE *configFile = NULL; + int fileNum = -1; + int sigNum = -1; + int i = 0; + + configFile = fopen( configFileName, "r" ); + if ( !configFile ) + { + printf( "Could not open %s\n", configFileName ); + return( NULL ); + } + else + printf( "Opened %s\n\n", configFileName ); + + fgets ( data, 1000, configFile ); + if ( feof( configFile ) || ( strncmp ( "Pathfinder Configuration", data, 24 ) != 0 ) ) + { + printf( "Error in config file: doesn't start with \"Pathfinder Configuration\"\n" ); + return false; + } + + fgets ( data, 1000, configFile ); + if ( feof( configFile ) || ( strncmp ( "files", data, 5 ) != 0 ) ) + { + printf( "Error in config file: second line is not file count\n" ); + return false; + } + fileNum = atoi( &data[6] ); + if ( fileNum == 0 ) + { + printf( "No files to parse, exiting.\n" ); + return false; + } + + fgets ( data, 1000, configFile ); + if ( feof( configFile ) || ( strncmp ( "signatures", data, 10 ) != 0 ) ) + { + printf( "Error in config file: third line is not signature count\n" ); + return false; + } + sigNum = atoi( &data[11] ); + if ( sigNum == 0 ) + { + printf( "No signatures to search, exiting.\n" ); + return false; + } + + fgets ( data, 1000, configFile ); + if ( feof( configFile ) || ( strncmp ( "search type", data, 11 ) != 0 ) ) + { + printf( "Error in config file: third line is not signature count\n" ); + return false; + } + if ( strncmp( &data[12], "tree", 4 ) == 0 ) + config->searchOptions->searchType = treeSearch; + else + config->searchOptions->searchType = diagramSearch; + + config->graphs = (Graph **)malloc( (fileNum+1) * sizeof( Graph* ) ); + if ( !config->graphs ) + { + printf ( "Could not allocate graph storage. Exiting\n" ); + return false; + } + + for ( i = 0; i < fileNum; ++i ) + { + fgets ( data, 1000, configFile ); + if ( feof( configFile ) || ( strncmp ( "file ", data, 5 ) != 0 ) ) /* note the ' ' */ + { + printf( "Error in config file: mismatch of file count\n" ); + return false; + } + + /* strip the \n from the file name. */ + pruneLine( &data[5] ); + config->graphs[i] = parseFile( &data[5] ); + if ( !config->graphs[i] ) + { + /* the file did not parse */ + printf( "Error parsing %s", &data[5] ); + free( config->graphs ); + return false; + } + } + config->graphs[fileNum] = NULL; + + config->signatures = (Signature *)malloc( (sigNum+1) * sizeof( Signature ) ); + if ( !config->signatures ) + { + printf ( "Could not allocate signature storage. Exiting\n" ); + return false; + } + + for ( i = 0; i < sigNum; ++i ) + { + fgets ( data, 1000, configFile ); + if ( feof( configFile ) || ( strncmp ( "signature ", data, 10 ) != 0 ) ) /* note the ' ' */ + { + printf( "Error in config file: mismatch of signature count\n" ); + return false; + } + + /* strip the \n from the file name. */ + pruneLine( &data[10] ); + config->signatures[i] = parseSignature( &data[10] ); + if ( !config->signatures[i] ) + { + /* the file did not parse */ + printf( "Error parsing %s", &data[10] ); + free( config->graphs ); /* Insufficient! Should call a destructor on each */ + free( config->signatures ); + return false; + } + } + config->signatures[sigNum] = NULL; + + return true; +} + + + Index: test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/searchAlgorithms.h =================================================================== --- test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/searchAlgorithms.h +++ test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/searchAlgorithms.h @@ -0,0 +1,106 @@ +/************************************************************************* + * + * PathFinder: finding a series of labeled nodes within a + * two-layer directed, cyclic graph. + * Copyright (2013) Sandia Corporation + * + * Copyright (2013) Sandia Corporation. Under the terms of Contract + * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government + * retains certain rights in this software. + * + * This file is part of PathFinder. + * + * PathFinder is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * PathFinder is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with PathFinder. If not, see . + * + * Questions? Contact J. Brian Rigdon (jbrigdo@sandia.gov) + * + */ + + + /* + * searchAlgorithms.h + * + * Created on: Jun 18, 2013 + * Author: Brian "Rig" Rigdon + */ + +#ifndef SEARCHALGORITHMS_H_ +#define SEARCHALGORITHMS_H_ + + +#include "vectorUtils.h" +#include "graph.h" +#include "configuration.h" + + +/* findNextLabel is a recursive method that determines if a path exists between a + * specific node and the label that is at the start of the label array argument. The + * label array is an array of char pointers that is terminated with a NULL pointer. The + * first pointer is the "current" label. + * + * The node's edge nodes are checked against the current label. If none of them match, then + * this method recurses with each edge node and the current label. + * + * If an edge matches, then we are beginning a search for the next "leg" of the labels. + * We recurse with that specific edge and the "next" label. That is the [1] element of + * the label array. If that element is NULL, the matching edge signifies the end of our + * search! VICTORY! + * + * If we reach the last edge with out a match (directly or recursively) we return a false + * list. + */ + +bool findNextLabel( Node *node, char *labels[], NodePtrVec *result, Bitfield *visited ); /* NodePtrVec *visited ); */ + +/* findAndRecordAllPaths is almost exactly like findNextLabel. It differs only in that it + * 1) doesn't stop with the first discovery of the specified path and 2) records the discovered + * path. To do this, it doesn't create a new result vector for + */ + +void findAndRecordAllPaths( Node *node, Signature labels, int *labelIdxs, + NodePtrVec *result, Bitfield *visited, NodeVecVec *storage, + SearchOptions *options ); + +/* + * findLabelPath takes an array of labels, determines if there are nodes associated + * with the labels (each label search will return a NodePtrVec*), and determine if + * paths exist passing through the set of labels. + */ +bool findLabelPath( Graph *graph, Signature labels, NodePtrVec *result, SearchType searchType ); + +/* + * findAllPossibleLegs does an exhaustive search through each possible label + * pairing to determine which legs are possible. This is a brute-force nxn + * approach that builds a signature holding only the second label and then + * searches for that signature from the nodes representing the first label. + * For the time being, it simply prints out the legs that are possible in + * this graph. + */ +int findAllPossibleLegs( Graph *graph, SearchType searchType ); + +/* + * findAndLogAllPossibleLegs is a duplicate of the above method, but it + * stores the results that are found + */ + +int findAndLogAllPossibleLegs( Graph *graph, SearchOptions *options ); + +/* Once the configuration file is parsed, a config structure is created that + * specifies the graphs and the signatures to be searched against. This method + * does multiple signature searches against multiple files + */ + +void doMultiSearchesQT(Configuration *config); + +#endif /* SEARCHALGORITHMS_H_ */ Index: test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/searchAlgorithms.c =================================================================== --- test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/searchAlgorithms.c +++ test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/searchAlgorithms.c @@ -0,0 +1,667 @@ +/************************************************************************* + * + * PathFinder: finding a series of labeled nodes within a + * two-layer directed, cyclic graph. + * Copyright (2013) Sandia Corporation + * + * Copyright (2013) Sandia Corporation. Under the terms of Contract + * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government + * retains certain rights in this software. + * + * This file is part of PathFinder. + * + * PathFinder is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * PathFinder is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with PathFinder. If not, see . + * + * Questions? Contact J. Brian Rigdon (jbrigdo@sandia.gov) + * + */ + + /* + * searchAlgorithms.c + * + * Created on: Jun 18, 2013 + * Author: jbrigdo + */ + +#include +#include +#include +#include +#include +#include + +#ifdef USE_OMP +#include +#endif + +#include "searchAlgorithms.h" +#include "vectorUtils.h" +#include "utils.h" +#include "graphGen.h" +#include "statistics.h" + + +extern double currentTime(); + +static Stats *globalStats = NULL; + + + +void doMultiSearches(Configuration *config) +{ + NodePtrVec *result; + bool success; + Graph *graph; + Signature signature; + int i; + int j; + char *debug; + double tick, tock; + int hours; + int min; + double sec; + + tick = currentTime(); + result = NodePtrVec_new(64); /* 64 is an arbitrary size */ + + for ( i = 0; config->signatures[i] != NULL; ++i ) + { + signature = config->signatures[i]; + /* Debug --* / + printf ("\n\nSignature ("); + for ( k = 0; signature[k] != NULL; ++k ) + { + debug = signature[k]; + printf("%s", signature[k]); + if ( signature[k+1] != NULL ) + printf(" "); + else + printf("):\n"); + } + / *-- End Debug */ + // printf("Signature %d:\n", i); + for ( j = 0; config->graphs[j] != NULL; ++j ) + { + graph = config->graphs[j]; + result->contentSize = 0; /* clear last search's result */ + // printf("\t checking file %s... ", graph->fileName); + fflush(stdout); + success = findLabelPath(graph, signature, result, config->searchOptions->searchType); + if ( success ) + {}// printf("Found!\n"); + else + {}// printf("Not found. Bummer.\n"); + } + } + + tock = currentTime(); + sec = tock-tick; + hours = (int)sec/3600; + sec = fmod( sec, 3600.0 ); + min = (int)sec/60; + sec = fmod(sec, 60.0); + printf ("\n\nOverall Search Time: %02d:02%d:%05.2f\n", hours, min, sec); + +} + +/* findNextLabel is a recursive method that determines if a path exists between a + * specific node and the label that is at the start of the label array argument. The + * label array is an array of char pointers that is terminated with a NULL pointer. The + * first pointer is the "current" label. + * + * The node's edge nodes are checked against the current label. If none of them match, then + * this method recurses with each edge node and the current label. + * + * If an edge matches, then we are beginning a search for the next "leg" of the labels. + * We recurse with that specific edge and the "next" label. That is the [1] element of + * the label array. This starts the search along the next leg - at this point we have + * to start a new "result" vector, because we check that vector for loops. It MAY be the + * case that the next path segment passes through nodes already traversed in a previous + * leg. A new "result" vector will solve that. + * + * If the next element in the labels list is NULL, the matching edge signifies the end of + * our search! VICTORY! + * + * If we reach the last edge with out a match (directly or recursively) we return a false + * list. + */ + +bool findNextLabel( Node *node, Signature labels, NodePtrVec *result, Bitfield *visited ) /* NodePtrVec *visited ) */ +{ + EdgeList *edge; + bool success = false; + NodePtrVec *nextLegResult = NULL; + /* NodePtrVec *nextLegVisited = NULL; */ + Bitfield *nextLegVisited = NULL; + + + /* A little basic error checking */ + if ( !node || !labels || !result|| !visited ) + { + return( false ); + } + + /* If this node is already in the vector, we have found a loop. return false. */ + + if ( Bitfield_nodeVisited( visited, node ) ) + return( false ); + + /* put this node on the result vector to show that we've been here */ + NodePtrVec_push( result, node ); + + /* Check this node's edges to see if there's a match */ + /* Note: We have a NodePtrVec holding the set of nodes with this label. It + * may be more optimal to see if a given edge node is in that set + * rather than doing a bunch of inefficient strcmp calls. Another approach + * would be to have unique hash values for each label, and thereby be + * able to compare those. However for the initial version of this code, + * keeping things simple and straightforward, we're doing the string + * compare. + */ + + for ( edge = node->edges; edge != NULL; edge = edge->nextEdge ) + { + + // string based: + if ( edge->targetNode->label && strcmp( edge->targetNode->label, labels[0] ) == 0 ) + // index based: if ( edge->targetNode->labelIdx == labelIdxs[0] ) + { + if ( labels[1] != NULL ) /* more steps in the signature */ + { + nextLegResult = NodePtrVec_new( 50 ); /* arbitrary size, malloc success checked in recursion */ + nextLegVisited = Bitfield_new(visited->bitsNeeded); + + success = findNextLabel( edge->targetNode, &labels[1], nextLegResult, nextLegVisited ); + /* NodePtrVec_delete( nextLegVisited ); */ + Bitfield_delete( nextLegVisited ); + if ( success ) + { + NodePtrVec_appendVectors( result, nextLegResult, true ); + NodePtrVec_delete( nextLegResult ); + return( true ); + } + + } + else /* We have exhausted the signature - ultimate victory! */ + { + /* Register this edge node as being the final node */ + NodePtrVec_push( result, edge->targetNode ); + return( true ); + } + } + } + + + /* IF we made it here, we need to continue through the tree, seeing if any of our + * edge nodes have a connection to a labeled node. + */ + for ( edge = node->edges; edge != NULL; edge = edge->nextEdge ) + { + success = findNextLabel( edge->targetNode, labels, result, visited ); + if ( success ) + return( true ); /* this edge has a path to the ultimate signature path */ + } + + + /* and, if we make it here, we have failed. */ + NodePtrVec_pop( result ); /* take current node off the result vector */ + return false; +} + + + +/* A method to custom-store our results */ +static void logStats(NodePtrVec *result) +{ + if ( !result ) return; + if ( !globalStats ) + globalStats = Stats_new(); + Stats_logPath(globalStats, result); +} + +static void printStats() +{ + int i; + + if ( globalStats ) + { + Stats_calculate(globalStats); + + printf ( "\nThis graph has %f average nodes between labels.\nStandard deviation: %f, total paths: %d\n\n", + globalStats->averageLength, globalStats->standardDeviation, globalStats->pathLengths->size ); + printf ("\tShortest Path: %d, Longest Path: %d\n", globalStats->minLength, globalStats->maxLength); + for ( i = globalStats->minLength; i <= globalStats->maxLength; ++i ) + { + if ( globalStats->histogram[i] != 0 ) + printf ("\tlength %d appeared %d times\n", i, globalStats->histogram[i] ); + } + + } +} + + +/* A method to custom-store our results */ + +/* At some point, we will want to use the FullPath argument and pass it along to + * buildGraphFromPaths. Until then, however, we're only going to build the most + * minimal graph possible. + */ +static void logResult(NodeVecVec *storage, NodePtrVec *result, SearchOptions *options) +{ + NodePtrVec *tips = NodePtrVec_new(2); + if ( !storage || !result || !tips ) return; + + /* We log the stats here, because the storage method below may not hold + * the entire path. + */ + if ( !options->multiThreaded && options->doStatistics ) /* statistics are not thread-safe yet */ + logStats(result); + + /* Ultimately we may want to log more than the ends... */ + /* Future: if ( options->buildType == endNodesOnly ) { */ + NodePtrVec_push(tips, result->vector[0]); + NodePtrVec_push(tips, result->vector[result->contentSize-1]); + if ( !NodeVecVec_insert(storage, tips) ) /* makes a copy of tips, so we need to... */ + { + printf("CrashAndBURN!!!\n\n"); + fflush(stdout); + } + NodePtrVec_delete(tips); /* ... free the mallocs! */ +} + + + +/* findAndRecordAllPaths is almost exactly like findNextLabel. It differs only in that it + * 1) doesn't stop with the first discovery of the specified path and 2) records the discovered + * path. To do this, it doesn't create a new result vector for + */ + +void findAndRecordAllPaths( Node *node, Signature labels, int *labelIdxs, + NodePtrVec *result, Bitfield *visited, NodeVecVec *storage, + SearchOptions *options ) +{ + EdgeList *edge; + /* NodePtrVec *nextLegVisited = NULL; */ + Bitfield *nextLegVisited = NULL; + + + /* A little basic error checking */ + if ( !node || !labels || !labelIdxs || !result|| !visited ) + { + return; + } + + /* If this node is already in the vector, we have found a loop. return false. */ +/* + if ( NodePtrVec_findReverse( visited, node ) ) + return( false ); + else + NodePtrVec_push( visited, node ); +*/ + if ( Bitfield_nodeVisited( visited, node ) ) + return; + + /* put this node on the result vector to show that we've been here */ + NodePtrVec_push( result, node ); + + /* Check this node's edges to see if there's a match */ + /* Note: We have a NodePtrVec holding the set of nodes with this label. It + * may be more optimal to see if a given edge node is in that set + * rather than doing a bunch of inefficient strcmp calls. Another approach + * would be to have unique hash values for each label, and thereby be + * able to compare those. However for the initial version of this code, + * keeping things simple and straightforward, we're doing the string + * compare. + */ + + for ( edge = node->edges; edge != NULL; edge = edge->nextEdge ) + { + + // string based: + if ( edge->targetNode->label && strcmp( edge->targetNode->label, labels[0] ) == 0 ) + // index based: if ( edge->targetNode->labelIdx == labelIdxs[0] ) + { + // strcmp based: + if ( labels[1] != NULL ) /* more steps in the signature */ + // index based: if ( labelIdxs[1] != -1 ) /* more steps in the signature */ + { + nextLegVisited = Bitfield_new(visited->bitsNeeded); + findAndRecordAllPaths(edge->targetNode, &labels[1], &labelIdxs[1], result, + nextLegVisited, storage, options ); + Bitfield_delete(nextLegVisited); + } + else /* We have exhausted the signature - ultimate victory! */ + { + /* Register this edge node as being the final node */ + // printf ("\tFound!\n"); + NodePtrVec_push(result, edge->targetNode); + Bitfield_nodeVisited(visited, edge->targetNode);/* Mark it as visited */ + logResult(storage, result, options); // <<<--- here's where I record it + NodePtrVec_pop(result); + } + } + } + + + /* IF we made it here, we need to continue through the tree, seeing if any of our + * edge nodes have a connection to a labeled node. + */ + for ( edge = node->edges; edge != NULL; edge = edge->nextEdge ) + { + findAndRecordAllPaths(edge->targetNode, labels, labelIdxs, result, visited, storage, options); + } + + NodePtrVec_pop( result ); /* take current node off the result vector */ + return; +} + + + +/* findLabelPath takes an array of labels, determines if there are nodes associated + * with the labels (each label search will return a NodePtrVec*), and determine if + * paths exist passing through the set of labels. This returns the first FOUND + * path, not the optimal one. We could do that in a future iteration of the code + * by keeping track of all paths found, and going with the shortest. + * + * The labels passed in is an array of char pointers. The array is null terminated - + * i.e. the last valid entry in the array is followed by a pointer with NULL in it. + */ +bool findLabelPath( Graph *graph, Signature labels, NodePtrVec *result, SearchType searchType ) +{ + NodePtrVec *startNodes = NULL; /* set of nodes with the first label - potential path start nodes */ + int i; + bool found = false; /* stopping as soon as we can find a path to a final node */ + /* NodePtrVec *visited = NodePtrVec_new( 50 ); /-* arbitrary size *-/ */ + Bitfield *visited = Bitfield_new(graph->totalNodes); + + + /* some basic error checking */ + if ( !graph || !labels || !labels[0] || !labels[1] || !result || !visited ) + return( false ); + + /* Un-comment to short-circuit searches for non-represented signatures. -->* / + if ( !SystemCallMap_signatureRepresented( graph->systemCallMap, labels ) ) + { + //printf( "%s %s invalid signature labels for graph.\n", labels[0], labels[1] ); + return( false ); + } + / *<-- end of short-circuit region */ + + startNodes = SystemCallMap_findLabeledNodes( graph->systemCallMap, labels[0] ); + + if ( !startNodes ) + return( false ); + + /* So, if we've made it this far, we have a valid start label. Now, we need to + * iterate through the start nodes and see if they can get to the next label... + */ + + for ( i = 0; i < startNodes->contentSize && !found; ++i ) + { + if ( searchType == diagramSearch ) + { + SearchDiagram *element = SearchDiagram_findNode( graph->searchDiagram, startNodes->vector[i] ); + if ( element ) + found = SearchDiagram_findSignatureAlongEdges( element->node, element->edgeReferenceArray, + &labels[1], result, visited ); + } + else + found = findNextLabel( startNodes->vector[i], &labels[1], result, visited ); + Bitfield_clear( visited ); + + if ( !found && result->contentSize != 0 ) /* If it's not found the result SHOULD be empty, however... */ + result->contentSize = 0; /* effectively clear the result NodePtrVec */ + } + + + /* NodePtrVec_delete( visited ); */ + Bitfield_delete( visited ); + return( found ); +} + + +/* findAllPossibleLegs does an exhaustive search through each possible label + * pairing to determine which legs are possible. This is a brute-force nxn + * approach that builds a signature holding only the second label and then + * searches for that signature from the nodes representing the first label. + * For the time being, it simply prints out the legs that are possible in + * this graph. + */ +int findAllPossibleLegs( Graph *graph, SearchType searchType ) +{ + int i, j; + int found = 0; + int searches = 0; + double tick, tock; + int hours, min; + double sec; + char timeStr[50]; + + tick = currentTime(); + fprintf ( stdout, "Immediately before parallel\n" ); + + //#pragma omp parallel private(i,j) shared(graph) reduction(+:found) reduction(+:searches) + //#pragma omp single + { + //#pragma omp parallel for private(i,j) default(none) + #ifdef USE_OMP + #pragma omp parallel for private(i,j) shared(graph) reduction(+:found) reduction(+:searches) + #pragma omp collapse(2) + #endif + for ( i = 0; i < graph->systemCallMap->contentSize; ++i ) + { + for ( j = 0; j < graph->systemCallMap->contentSize; ++j ) + { + ++searches; + char *fullSignature[3] = { NULL, NULL, NULL }; + int fullIntSignature[3] = { 0, 0, -1 }; + fullSignature[0] = graph->systemCallMap->vector[i]->label; + fullSignature[1] = graph->systemCallMap->vector[j]->label; + fullIntSignature[0] = i; + fullIntSignature[1] = j; + // NodePtrVec *result = NodePtrVec_new(25); + + /* findLabelPath does the findNextLabel in the above loops */ + //#pragma omp task shared(graph, fullSignature, found) + { + NodePtrVec *result = NodePtrVec_new( 25 ); + if ( findLabelPath( graph, fullSignature, result, searchType ) ) + { +// printStack(result); + // logStats(result); + ++ found; + } + else + { +// printf ( "\n\tPath does not exist %s --/ /-> %s. %d steps.\n", fullSignature[0], +// fullSignature[1], result->contentSize ); + } + if ( result ) + { + NodePtrVec_delete( result ); + } + } + } + //#pragma omp taskwait + } + } + + + tock = currentTime(); + + + sec = tock-tick; + hours = (int)sec/3600; + sec = fmod( sec, 3600.0 ); + min = (int)sec/60; + sec = fmod( sec, 60.0 ); + printf ( "\n\n%d found out of %d searches. Overall Time: %d:%d:%2.3f\n", + found, searches, hours, min, sec ); + timeStr[0] = '\0'; /* just in case sprintf doesn't do what we want. */ + sprintf ( timeStr, "%02d:%02d:%02.3f", hours, min, sec ); + YAMLWriteInt("Signatures Found", found); + YAMLWriteString("Search Time", timeStr); + + + //printStats(); + + return( found ); +} + +/* + * findAndLogAllPossibleLegs has the same search algorithm as findAllPossibleLegs. However, the requirement + * that all the legs be logged requires a more sophisticated means of parallelization in order to do a + * reduction of the solutions when all the threads are done. + */ +int findAndLogAllPossibleLegs(Graph *graph, SearchOptions *options) +{ + int i, j, k; + int found = 0; + int searches = 0; + double tick, tock; + int hours, min; + double sec; + int maxThreads = 1; + NodeVecVec **lastingResults; + Graph *optimizedGraph = NULL; + char timeStr[50]; + + /* A little bit of error checking */ + if ( !graph ) + return 0; + + tick = currentTime(); + fprintf(stdout, "Immediately before parallel\n" ); + + #ifdef USE_OMP + #pragma omp parallel private(i,j,k) shared(graph,maxThreads,lastingResults) reduction(+:found) reduction(+:searches) + #endif + { + #ifdef USE_OMP + int myThread = omp_get_thread_num(); + #else + int myThread = 0; + #endif + + NodeVecVec *myResults = NULL; + + #ifdef USE_OMP + #pragma omp single + #endif + { + #ifdef USE_OMP + maxThreads = omp_get_num_threads(); + #else + maxThreads = 1; + #endif + + options->multiThreaded = maxThreads > 1; + /* debug * /printf( "%d total threads, this one is %d\n", maxThreads, myThread ); /* debug */ + lastingResults = malloc((maxThreads+1) * sizeof(NodeVecVec*) ); + lastingResults[maxThreads] = 0; /* Null terminated to avoid having to keep track of bitsNeeded */ + } + + #ifdef USE_OMP + #pragma omp critical + #endif + { + lastingResults[myThread] = NodeVecVec_new(64); /* Arbitrary - multiple of 8, eventually cache line aligned... */ + myResults = lastingResults[myThread]; + } + + #ifdef USE_OMP + #pragma omp single + #endif + { + printf ("Immediately before nested for's\n"); + } + + #ifdef USE_OMP + #pragma omp for + #pragma omp collapse(2) + #endif + for ( i = 0; i < graph->systemCallMap->contentSize; ++i ) + { + for ( j = 0; j < graph->systemCallMap->contentSize; ++j ) + { + ++searches; + for (k = 0; k < graph->systemCallMap->vector[i]->nodes->contentSize; ++k) + { + char *fullSignature[3] = { NULL, NULL, NULL }; + int fullIntSignature[3] = { 0, 0, -1 }; + fullSignature[0] = graph->systemCallMap->vector[i]->label; + fullSignature[1] = graph->systemCallMap->vector[j]->label; + fullIntSignature[0] = i; + fullIntSignature[1] = j; + NodePtrVec *result = NodePtrVec_new(16); + Bitfield *visited = Bitfield_new(graph->totalNodes); + /* debug ---> * / + printf( "Searching for %s(%d) ~~~> %s\n", fullSignature[0], + graph->systemCallMap->vector[i]->nodes->vector[k]->id, + fullSignature[1]); + /* <-- debug */ + findAndRecordAllPaths( graph->systemCallMap->vector[i]->nodes->vector[k], &fullSignature[1], + &fullIntSignature[1], result, visited, myResults, options ); + Bitfield_delete(visited); + if ( result ) + NodePtrVec_delete( result ); + } // end of for (k)... fork? heh. + } // end of for (j) + } // end of for (i) + + found = myResults->contentSize; + } + + tock = currentTime(); + sec = tock-tick; + hours = (int)sec/3600; + sec = fmod( sec, 3600.0 ); + min = (int)sec/60; + sec = fmod( sec, 60.0 ); + printf ( "\n\n%d found for %d searches. Overall Time: %d:%d:%2.3f\n", + found, searches, hours, min, sec ); + timeStr[0] = '\0'; /* just in case sprintf doesn't do what we want. */ + sprintf ( timeStr, "%02d:%02d:%02.3f", hours, min, sec ); + YAMLWriteInt("Signatures Found", found); + YAMLWriteString("Search Time", timeStr); + + /* debug --> * / + printf ("max threads still:%d\n", maxThreads); + for ( i = 0; i < maxThreads; ++i ) + { + printf ( "printing out thread %d result - %d long\n", i, lastingResults[i]->contentSize ); + for ( j = 0; j < lastingResults[i]->contentSize; ++j ) + { + printf("\t"); + printStack( lastingResults[i]->vector[j] ); + printf("\n"); + } + } + /* <-- debug */ + + /* At some point, we will want to use the FullPath argument and pass it along to + * buildGraphFromPaths. Until then, however, we're only going to build the most + * minimal graph possible. + */ + if ( options->writeOutputFile && options->outputFile ) + { + optimizedGraph = buildGraphFromPaths(lastingResults, options->buildType); + exportGraph(optimizedGraph, options->outputFile); + } + + if ( options->doStatistics && !options->multiThreaded ) + printStats(); + + return( found ); +} Index: test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/searchDiagram.h =================================================================== --- test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/searchDiagram.h +++ test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/searchDiagram.h @@ -0,0 +1,93 @@ +/************************************************************************* + * + * PathFinder: finding a series of labeled nodes within a + * two-layer directed, cyclic graph. + * Copyright (2013) Sandia Corporation + * + * Copyright (2013) Sandia Corporation. Under the terms of Contract + * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government + * retains certain rights in this software. + * + * This file is part of PathFinder. + * + * PathFinder is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * PathFinder is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with PathFinder. If not, see . + * + * Questions? Contact J. Brian Rigdon (jbrigdo@sandia.gov) + * + */ + +/* + * searchDiagram.h + * + * Created on: Feb 1, 2013 + * Author: Brian "Rig" Rigdon, Marcus Smith, Samuel Mulder + */ + +#ifndef SEARCHDIAGRAM_H_ +#define SEARCHDIAGRAM_H_ + +#include "node.h" + +typedef struct SearchDiagramStruct SearchDiagram; +typedef struct EdgeReferencesStruct EdgeReferences; + +struct SearchDiagramStruct +{ + Node *node; /* a reference to the node */ + EdgeReferences *edgeReferenceArray; /* All the nodes reachable from here */ +}; + +/* We are creating arrays of SearchDiagram - constructor/destructor would be superfluous */ + + +/* The EdgeSearchStruct holds a different representation of + * the tree through which we're searching. Our search diagram + * will create an array of these for each node in the graph. + * Searches will go through the array, looking to match the + * search criteria. If the search is unsuccessful, it will + * then search the edges of the node. In this array, the first + * element is the SEARCH ELEMENT we're comparing against. In + * this iteration of the code, we're using the Node pointer + * as the search key. The second element is the search edges + * contained by that node. The search edges are referenced + * directly, no need to go back to the SearchDiagram instance + * to get to the edges. + */ + +struct EdgeReferencesStruct +{ + Node *edgeTarget; /* The address of the node is how we're defining our search */ + EdgeReferences *targetNodeEdges; /* pointer to the "to" node's edge references */ +}; + +/* We are creating arrays of EdgeReferences - constructor/destructor would be superfluous */ + +/* Scream through the diagram to get the element corresponding to this Node* */ +SearchDiagram *SearchDiagram_findNode ( SearchDiagram *diagram, Node *node ); + +/* The meat of this process - the function that creates the search diagram. + * It allocates the memory for the array of search diagram elements and + * populates them with node data and edgeID arrays. + */ +SearchDiagram *SearchDiagram_build ( NodeList *nodeTree, int nodeCount ); + + +/* And, our search methods. The first calls the second, which is recursive */ + +bool SearchDiagram_findSignatureAlongEdges ( Node *node, EdgeReferences *edges, + char *labels[], NodePtrVec *result, Bitfield *visited ); + + + +#endif /* SEARCHDIAGRAM_H_ */ Index: test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/searchDiagram.c =================================================================== --- test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/searchDiagram.c +++ test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/searchDiagram.c @@ -0,0 +1,284 @@ +/************************************************************************* + * + * PathFinder: finding a series of labeled nodes within a + * two-layer directed, cyclic graph. + * Copyright (2013) Sandia Corporation + * + * Copyright (2013) Sandia Corporation. Under the terms of Contract + * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government + * retains certain rights in this software. + * + * This file is part of PathFinder. + * + * PathFinder is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * PathFinder is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with PathFinder. If not, see . + * + * Questions? Contact J. Brian Rigdon (jbrigdo@sandia.gov) + * + */ + + +/* + * searchDiagram.c + * + * Created on: Feb 1, 2013 + * Author: Brian "Rig" Rigdon, Marcus Smith, Samuel Mulder + */ + +#include "searchDiagram.h" +#include +#include +#include + + +/* Scream through the diagram to get the element corresponding to this key. This + * simply iterates through the entire list, there is no optimization in the search + * algorithm. + */ +SearchDiagram *SearchDiagram_findNode ( SearchDiagram *diagram, Node *node ) +{ + int idx; + + /* Do some basic error checking */ + if ( !diagram ) + return( NULL ); + + for ( idx = 0; diagram[idx].node != NULL; ++idx ) + { + if ( diagram[idx].node == node ) /* We found it! */ + return( &diagram[idx] ); + } + + /* If we made it here, we couldn't find it. */ + return( NULL ); +} + + + +/* The meat of this process - the function that creates the search diagram. + * It allocates the memory for the array of search diagram elements and + * populates them with node data and edgeID arrays. Outer nodes are inserted + * into the node array from the lowest addresses and inner nodes are inserted + * into the search diagram from the highest. The authors did this to (hopefully) + * give a little more efficiency to the searching of the diagram. + */ +SearchDiagram *SearchDiagram_build( NodeList *nodeTree, int nodeCount ) +{ + SearchDiagram *diagram = NULL; + NodeList *outerNodes = NULL; + Node *node = NULL; + NodeList *innerNodes = NULL; + /* Originally, we speculated that searches would stream through the outer + * nodes more than through the interior nodes. (We were wrong.) So we had + * this mechanism in place to put the outer nodes at the beginning of the + * diagram and the interior nodes at the end. Because we were wrong, this + * increases the likelihood of cache misses rather than decreasing it. Ergo + * we have replaced the outerIdx and the innerIdx calls. + * + * So... it turns out that putting the inner nodes near their containing + * node actually slows things down - but it's minor (2% - 3 minutes in a + * 120 minute run.) + int index = 0; + */ + int outerIdx = 0; /* index from the bottom up for outer nodes */ + int innerIdx = nodeCount-1; /* and from the top down for interior nodes */ + + int edgeCount; + EdgeList *edges; + SearchDiagram *element; /* for searching in our diagram */ + + /* Do some basic error checking */ + if ( !nodeTree || nodeCount == 0 ) + return NULL; + + /* Allocate an array of SearchDiagram Elements (+1 for a terminus element) */ + diagram = malloc ( (nodeCount+1) * sizeof(SearchDiagram) ); + if ( !diagram ) /* malloc failed */ + return( NULL ); + + diagram[nodeCount].node = NULL; + diagram[nodeCount].edgeReferenceArray = NULL; + + /* Scream through the Nodes and fill in the Search Array allocate space for edges */ + for ( outerNodes = nodeTree; outerNodes != NULL; outerNodes = outerNodes->nextNode ) + { + node = outerNodes->node; + /* This diagram entry needs a key */ + diagram[outerIdx].node = node; + /* How many edges do we need? */ + edgeCount = node->edgeCount + node->entranceCount; + if ( edgeCount > 0 ) /* allocate space for edgeIdArray (+1 for a terminus element) */ + { + diagram[outerIdx].edgeReferenceArray = malloc ( (edgeCount+1) * sizeof(EdgeReferences) ); + diagram[outerIdx].edgeReferenceArray[edgeCount].edgeTarget = NULL; + diagram[outerIdx].edgeReferenceArray[edgeCount].targetNodeEdges = NULL; + } + else + diagram[outerIdx].edgeReferenceArray = NULL; + + /* What do we do if that malloc fails? */ + + /* increment the outer index: */ + ++outerIdx; + + /* Now do the same for this node's interior graph (if present) */ + for ( innerNodes = node->interiorNodes; innerNodes != NULL; innerNodes = innerNodes->nextNode ) + { + node = innerNodes->node; + diagram[innerIdx].node = node; + edgeCount = node->edgeCount + node->entranceCount; + if ( node->edgeCount > 0 ) /* allocate space for edgeIdArray (+1 for a terminus element) */ + { + diagram[innerIdx].edgeReferenceArray = malloc ( (edgeCount+1) * sizeof(EdgeReferences) ); + diagram[innerIdx].edgeReferenceArray[edgeCount].edgeTarget = NULL; + diagram[innerIdx].edgeReferenceArray[edgeCount].targetNodeEdges = NULL; + } + else + diagram[innerIdx].edgeReferenceArray = NULL; + + /* Again, what do we do if that malloc fails? */ + + /* decrement the interior index: */ + --innerIdx; + } + + } + + + /* Check to make sure our counters line up. If they don't, we have a corrupt + * graph. That is, there is a mismatch between node definitions and edge lists. + * The innerIdx should reference the previous outerIdx location. + */ + if ( outerIdx != innerIdx +1 ) + { + /* Houston, we have a problem */ + printf ( "Bummer. outerIdx: %d, innerIdx: %d, node count: %d\n", outerIdx, innerIdx, nodeCount ); + } + + + /* For each node, populate its edge list - edges and entrance nodes (if there) */ + outerIdx = 0; + innerIdx = nodeCount-1; + for ( outerNodes = nodeTree; outerNodes != NULL; outerNodes = outerNodes->nextNode ) + { + /* iterate through this node's edges to populate the EdgeIdArray */ + node = outerNodes->node; + for ( edges = node->edges, edgeCount = 0; + edges != NULL; + edges = edges->nextEdge, ++edgeCount ) + { + element = SearchDiagram_findNode( diagram, edges->targetNode ); + diagram[outerIdx].edgeReferenceArray[edgeCount].edgeTarget = edges->targetNode; + diagram[outerIdx].edgeReferenceArray[edgeCount].targetNodeEdges = element->edgeReferenceArray; + } + ++outerIdx; + + /* And then scream through the interior nodes to take care of their edges */ + for ( innerNodes = node->interiorNodes; innerNodes != NULL; innerNodes = innerNodes->nextNode ) + { + node = innerNodes->node; + for ( edges = node->edges, edgeCount = 0; + edges != NULL; + edges = edges->nextEdge, ++edgeCount ) + { + element = SearchDiagram_findNode( diagram, edges->targetNode ); + diagram[innerIdx].edgeReferenceArray[edgeCount].edgeTarget = edges->targetNode; + diagram[innerIdx].edgeReferenceArray[edgeCount].targetNodeEdges = element->edgeReferenceArray; + } + --innerIdx; + } + } + + return diagram; +} + + + +bool SearchDiagram_findSignatureAlongEdges ( Node *node, EdgeReferences *edges, + char *labels[], NodePtrVec *result, Bitfield *visited ) +{ + bool success = false; + NodePtrVec *nextLegResult = NULL; + Bitfield *nextLegVisited = NULL; + int i; + + /* A little basic error checking */ + if ( !node || !edges || !labels || !result|| !visited ) + { + return( false ); + } + + /* If this node has already been visited, we have found a loop. return false. */ + +/* + if ( NodePtrVec_findReverse( visited, node ) ) + return( false ); + else + NodePtrVec_push( visited, node ); +*/ + if ( Bitfield_nodeVisited( visited, node ) ) + return( false ); + + NodePtrVec_push( result, node ); + + /* Go through the edges once to see if we've found a label match */ + for ( i = 0; edges[i].edgeTarget != NULL; ++i ) + { + if ( edges[i].edgeTarget->label ) + { + //strcmp based: + if ( strcmp( edges[i].edgeTarget->label, labels[0] ) == 0 ) /* match! */ + // index based: if ( edges[i].edgeTarget->labelIdx == labelIdxs[0] ) + { + if ( labels[1] == NULL ) /* end of the signature, we're DONE */ + { + NodePtrVec_push( result, edges[i].edgeTarget ); + return( true ); + } + else /* RECURSE TO SEE IF THE REST OF THE SIGNATURE CAN BE FOUND!!! */ + { + nextLegResult = NodePtrVec_new( 50 ); /* arbitrary size, malloc success checked in recursion */ + nextLegVisited = Bitfield_new(visited->bitsNeeded); + + success = SearchDiagram_findSignatureAlongEdges ( edges[i].edgeTarget, + edges[i].targetNodeEdges, + &labels[1], nextLegResult, nextLegVisited ); + Bitfield_delete( nextLegVisited ); + if ( success ) + { + NodePtrVec_appendVectors( result, nextLegResult, true ); + NodePtrVec_delete( nextLegResult ); + return( true ); + } + } + } + } + } + + /* IF we made it here, we need to continue through the tree, seeing if any of our + * edge nodes have a connection to a labeled node. + */ + for ( i = 0; edges[i].edgeTarget != NULL; ++i ) + { + success = SearchDiagram_findSignatureAlongEdges( edges[i].edgeTarget, + edges[i].targetNodeEdges, + labels, result, visited ); + if ( success ) + return( true ); /* this edge has a path to the ultimate signature path */ + } + + + /* and, if we make it here, we have failed. */ + NodePtrVec_pop( result ); /* take current node off the result stack */ + return false; +} Index: test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/statistics.h =================================================================== --- test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/statistics.h +++ test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/statistics.h @@ -0,0 +1,71 @@ +/************************************************************************* + * + * PathFinder: finding a series of labeled nodes within a + * two-layer directed, cyclic graph. + * Copyright (2013) Sandia Corporation + * + * Copyright (2013) Sandia Corporation. Under the terms of Contract + * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government + * retains certain rights in this software. + * + * This file is part of PathFinder. + * + * PathFinder is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * PathFinder is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with PathFinder. If not, see . + * + * Questions? Contact J. Brian Rigdon (jbrigdo@sandia.gov) + * + */ + + +/* + * statistics.h + * + * Created on: Sept 24, 2013 + * Author: Brian "Rig" Rigdon + */ + +#ifndef STATISTICS_H +#define STATISTICS_H + +#include "vectorUtils.h" + +typedef struct HistogramElementStruct HistogramElement; +struct HistogramElementStruct +{ + int length; + int count; + struct HistogramElementStruct *next; +}; + +HistogramElement *HistogramElement_new(int length); + +typedef struct StatsStruct Stats; +struct StatsStruct +{ + IntVector *pathLengths; + int minLength; + int maxLength; + double averageLength; // does it make sense to say 2.7823 nodes long? + double standardDeviation; + int *histogram; +}; + +Stats *Stats_new(); +void Stats_delete(Stats* stats); +bool Stats_logPath(Stats* stats, NodePtrVec* path); +void Stats_calculate(Stats* stats); + +void testStats(); + +#endif // STATISTICS_H Index: test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/statistics.c =================================================================== --- test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/statistics.c +++ test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/statistics.c @@ -0,0 +1,238 @@ +/************************************************************************* + * + * PathFinder: finding a series of labeled nodes within a + * two-layer directed, cyclic graph. + * Copyright (2013) Sandia Corporation + * + * Copyright (2013) Sandia Corporation. Under the terms of Contract + * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government + * retains certain rights in this software. + * + * This file is part of PathFinder. + * + * PathFinder is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * PathFinder is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with PathFinder. If not, see . + * + * Questions? Contact J. Brian Rigdon (jbrigdo@sandia.gov) + * + */ + +/* + * statistics.c + * + * Created on: Sept 24, 2013 + * Author: Brian "Rig" Rigdon + */ + +#include "statistics.h" +#include +#include + +HistogramElement *HistogramElement_new(int length) +{ + HistogramElement *new = malloc(sizeof(HistogramElement)); + if ( !new ) + return NULL; + new->length = length; + new->count = 1; + new->next = NULL; + return(new); +} + +bool HistogramElement_updateList(HistogramElement **head, int length) +{ + HistogramElement **prev = NULL; + HistogramElement *current = NULL; + HistogramElement *new = NULL; + bool histogramInsert = false; + + prev = head; + for ( current = *head; current != NULL; current = current->next ) + { + if ( current->length < length ) + { + prev = ¤t->next; + continue; /* iterate down the histogram linked list */ + } + if ( current->length == length ) + { + ++current->count; + histogramInsert = true; + break; + } + if ( current->length > length ) + { + /* we are logging a new length, need to allocate and insert */ + new = HistogramElement_new(length); + if ( ! new ) + return(false); + new->next = current; + (*prev) = new; + histogramInsert = true; + break; + } + } + + if ( !histogramInsert ) /* this element belongs at the end of the chain */ + { + (*prev) = HistogramElement_new(length); + if ( (*prev) == NULL ) + return(false); + } + + return(true); +} + +Stats *Stats_new() +{ + Stats* new = malloc(sizeof(Stats)); + if ( new ) + { + new->pathLengths = IntVector_new(16); // Arbitrary, multiple of 8 for vectorization + new->averageLength = 0.0; + new->standardDeviation = 0.0; + new->minLength = INT_MAX; + new->maxLength = 0; + new->histogram = NULL; + if ( new->pathLengths ) + return(new); + else + { + free(new); + return(NULL); + } + } + else + return(NULL); +} + + +void Stats_delete(Stats* stats) +{ + if ( stats ) + { + if ( stats->pathLengths ) + free(stats->pathLengths); + free(stats); + } +} + + +bool Stats_logPath(Stats* stats, NodePtrVec* path) +{ +// bool histogramInsert = false; +// HistogramElement **prev = NULL; +// HistogramElement *hist = NULL; +// HistogramElement *new = NULL; + int length; + + if ( !stats || !stats->pathLengths || !path ) + return(false); + + length = path->contentSize; + if ( length < stats->minLength ) + stats->minLength = length; + if ( length > stats->maxLength ) + stats->maxLength = length; + return ( IntVector_insertEnd(stats->pathLengths, length) ); +} + +void Stats_calculate(Stats* stats) +{ + int i; + int length; + double sum; + double diff; + + /* a little basic error checking */ + if ( !stats || !stats->pathLengths || stats->pathLengths == 0 ) + return; + stats->histogram = calloc((stats->maxLength+1), sizeof(int)); + if ( !stats->histogram ) + return; + + for ( i = 0; i < stats->pathLengths->size; ++i ) + { + if ( stats->pathLengths->vector[i] > 0 ) + { + length = stats->pathLengths->vector[i]; + sum += (double)length; + /* While we're iterating through the list, let's build our histogram... */ + /* HistogramElement_updateList(&stats->histogram, length); */ + stats->histogram[length] += 1; + } + } + if ( i > 0 ) + stats->averageLength = sum / (double)i; + + sum = 0.0; + for ( i = 0; i < stats->pathLengths->size; ++i ) + { + if ( stats->pathLengths->vector[i] > 0 ) + { + diff = (double)stats->pathLengths->vector[i] - stats->averageLength; + sum += diff * diff; + } + } + + if ( i > 0 ) + stats->standardDeviation = sqrt(sum/(double)i); +} + + +void testStats() +{ + int i; + Stats *test = Stats_new(); + NodePtrVec bogon; + + for ( i = 2; i < 10; ++i ) + { + bogon.contentSize = i; + Stats_logPath(test,&bogon); + } + + /* Throw in some more silly data */ + bogon.contentSize = 1; + Stats_logPath(test,&bogon); + bogon.contentSize = 4; + Stats_logPath(test,&bogon); + bogon.contentSize = 5; + Stats_logPath(test,&bogon); + bogon.contentSize = 6; + Stats_logPath(test,&bogon); + bogon.contentSize = 5; + Stats_logPath(test,&bogon); + bogon.contentSize = 5; + Stats_logPath(test,&bogon); + bogon.contentSize = 4; + Stats_logPath(test,&bogon); + bogon.contentSize = 5; + Stats_logPath(test,&bogon); + bogon.contentSize = 6; + Stats_logPath(test,&bogon); + bogon.contentSize = 5; + Stats_logPath(test,&bogon); + bogon.contentSize = 5; + Stats_logPath(test,&bogon); + + Stats_calculate(test); + printf("avg: %f\nstd dev: %f\n", test->averageLength, test->standardDeviation); + printf("Histogram:\n"); + for ( i = test->minLength; i < test->maxLength; ++i ) + { + printf ("\tlength %d appeared %d times\n", i, test->histogram[i] ); + } + +} + Index: test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/systemCallMap.h =================================================================== --- test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/systemCallMap.h +++ test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/systemCallMap.h @@ -0,0 +1,112 @@ +/************************************************************************* + * + * PathFinder: finding a series of labeled nodes within a + * two-layer directed, cyclic graph. + * Copyright (2013) Sandia Corporation + * + * Copyright (2013) Sandia Corporation. Under the terms of Contract + * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government + * retains certain rights in this software. + * + * This file is part of PathFinder. + * + * PathFinder is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * PathFinder is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with PathFinder. If not, see . + * + * Questions? Contact J. Brian Rigdon (jbrigdo@sandia.gov) + * + */ + +/* + * systemCallMap.h + * + * Created on: Feb 5, 2013 + * Author: Brian "Rig" Rigdon, Marcus Smith, Samuel Mulder + */ + +#ifndef SYSTEMCALLMAP_H_ +#define SYSTEMCALLMAP_H_ + +#include +#include "node.h" + + + +/* A signature is an array of character pointers. Signature arrays + * are terminated with a NULL pointer so we don't have to have an + * additional datum to contain the length of the array. To make + * the code more readable, we are using this typedef: + */ +typedef char **Signature; /* code must be careful to ensure NULL termination */ + + +/* + * SystemCallMapStruct specifies a label and all the nodes that are associated with + * that label. Currently, this is sub-optimal, managing via strcmp. If optimization + * is needed, that is left as an exercise for the future. We could see the future + * addition of hash values + */ + +typedef struct SystemCallMapElementStruct SystemCallMapElement; + +struct SystemCallMapElementStruct +{ + char *label; + int index; + NodePtrVec *nodes; +}; + +SystemCallMapElement *SystemCallMapElement_new ( char *label, int initialSize ); /* Element constructor */ +void SystemCallMapElement_delete( SystemCallMapElement *trash ); /* Element destructor */ + + + + +/* The call map is actually a stack (managed like the STL deque) of SystemCallMapElements. + * It will insert up to its capacity, and then double its size (allocating a new space, copying + * and then freeing the old) when it grows beyond its capacity. + */ + +typedef struct SystemCallMapStruct SystemCallMap; + +struct SystemCallMapStruct +{ + int contentSize; + int allocatedSize; + SystemCallMapElement **vector; /* a pointer to an array of pointers */ +}; + +SystemCallMap *SystemCallMap_new( int initialSize ); +void SystemCallMap_delete( SystemCallMap *trash ); /* destructor for an ENTIRE MAP!!! */ + +/* insert checks to see if there is already an entry for the name passed in. If so, + * it appends the node to that map element. If not, a new element is created, the + * name is duplicated + */ +bool SystemCallMap_insert ( SystemCallMap *map, char *label, Node *node ); + + +/* Finds a list of nodes associated with a label. */ +NodePtrVec *SystemCallMap_findLabeledNodes( SystemCallMap *systemCalls, char *label ); + +/* Returns the index of a given label */ +int SystemCallMap_getLabelIndex( SystemCallMap *map, char *label ); + +/* + * Determines if all the labels in a given signature are represented + * within this graph. If not, we know the search will fail. There's + * gotta be a better name for this... + */ +bool SystemCallMap_signatureRepresented( SystemCallMap *map, Signature signature ); + +#endif /* SYSTEMCALLMAP_H_ */ Index: test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/systemCallMap.c =================================================================== --- test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/systemCallMap.c +++ test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/systemCallMap.c @@ -0,0 +1,246 @@ +/************************************************************************* + * + * PathFinder: finding a series of labeled nodes within a + * two-layer directed, cyclic graph. + * Copyright (2013) Sandia Corporation + * + * Copyright (2013) Sandia Corporation. Under the terms of Contract + * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government + * retains certain rights in this software. + * + * This file is part of PathFinder. + * + * PathFinder is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * PathFinder is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with PathFinder. If not, see . + * + * Questions? Contact J. Brian Rigdon (jbrigdo@sandia.gov) + * + */ + +/* + * systemCallMap.c + * + * Created on: Feb 5, 2013 + * Author: Brian "Rig" Rigdon, Marcus Smith, Samuel Mulder + */ + +#include "systemCallMap.h" +#include +#include +#include + +/* Element constructor */ +SystemCallMapElement *SystemCallMapElement_new ( char *label, int initialSize ) +{ + SystemCallMapElement *element = malloc ( sizeof( SystemCallMapElement ) ); + if ( element ) + { + element->label = strdup ( label ); + element->index = -1; /* Set by the insertion algorithm */ + if ( !element->label ) + { + free( element ); + return( NULL ); + } + element->nodes = NodePtrVec_new( initialSize ); + if ( !element->nodes ) + { + free( element->label ); + free( element ); + return( NULL ); + } + } + + return( element ); +} + +/* Element destructor */ +void SystemCallMapElement_delete( SystemCallMapElement *trash ) +{ + /* free the mallocs! */ + if ( trash ) + { + if ( trash->label ) + free( trash->label ); + NodePtrVec_delete ( trash->nodes ); + } +} + + + + + +/* Constructor */ +SystemCallMap *SystemCallMap_new ( int initialSize ) +{ + SystemCallMap *map = NULL; + SystemCallMapElement **vector = NULL; + + if ( initialSize <= 0 ) + return NULL; + + vector = malloc( initialSize * sizeof( SystemCallMapElement* ) ); + if ( vector ) + { + map = malloc ( sizeof( SystemCallMap ) ); + if ( map ) + { + map->allocatedSize = initialSize; + map->contentSize = 0; + map->vector = vector; + } + else + free( vector ); + } + + return map; +} + +/* destructor for an ENTIRE MAP!!! */ +void SystemCallMap_delete( SystemCallMap *trash ) +{ + int i; + + /* basic error checking */ + if ( !trash ) + return; + + for ( i = 0; i < trash->contentSize; ++i ) + { + SystemCallMapElement_delete( trash->vector[i] ); + } +} + + + +/* setter */ +bool SystemCallMap_insert ( SystemCallMap *map, char *label, Node *node ) +{ + int i = 0; + SystemCallMapElement *newElement = NULL; + bool success = false; + + /* Some basic error checking */ + if ( !map || !label || !node ) + return( false ); + + /* See if this label has already been implemented */ + for ( i = 0; i < map->contentSize; ++i ) + { + if ( strcmp( label, map->vector[i]->label ) == 0 ) + { + /* found it! */ + node->label = map->vector[i]->label; + node->labelIdx = i; + return( NodePtrVec_push( map->vector[i]->nodes, node ) ); + } + } + + /* If we make it here, we have a new label */ + if ( map->contentSize == map->allocatedSize ) + { + /* Full up! Need a new vector */ + map->vector = realloc( map->vector, (map->allocatedSize*2 * sizeof( SystemCallMapElement * )) ); + if ( map->vector ) + { + map->allocatedSize *= 2; + } + else + return( false ); + } + + newElement = SystemCallMapElement_new( label, 8 ); /* arbitrary size of 8 */ + if ( !newElement ) + return( false ); + + success = NodePtrVec_push( newElement->nodes, node ); + if ( !success ) + SystemCallMapElement_delete( newElement ); + + node->label = newElement->label; + node->labelIdx = newElement->index = map->contentSize; /* Does newElement really need the index? */ + map->vector[map->contentSize] = newElement; + map->contentSize += 1; + + return( true ); + +} + + + +/* Finds all nodes associated with a label. */ +NodePtrVec *SystemCallMap_findLabeledNodes( SystemCallMap *systemCalls, char *label ) +{ + int i; + + /* Debug --> * / + printf("Inside SystemCallMap_findLabeledNodes, label: %s\n", label); + / *<-- end debug */ + if ( !systemCalls || !label ) + return( NULL ); + + for( i = 0; i < systemCalls->contentSize; ++i ) + { + /* Debug -->* / + printf("\t...checking against %s...\n", systemCalls->vector[i]->label); + / * <-- end debug */ + if ( strcmp( label, systemCalls->vector[i]->label ) == 0 ) + return( systemCalls->vector[i]->nodes ); + } + + /* Debug --> * / + printf("\tleaving SystemCallMap_findLabeledNodes, nothing found.\n"); + / *<-- end debug */ + return( NULL ); +} + +/* Returns the index of a given label */ +int SystemCallMap_getLabelIndex( SystemCallMap *map, char *label ) +{ + int i; + + /* See if this label has already been implemented */ + for ( i = 0; i < map->contentSize; ++i ) + { + if ( strcmp( label, map->vector[i]->label ) == 0 ) + { + return( i ); + } + } + + /* If we made it here, this label is not represented */ + return( -1 ); +} + + +/* + * Determines if all the labels in a given signature are represented + * within this graph. If not, we know the search will fail. There's + * gotta be a better name for this... + */ +bool SystemCallMap_signatureRepresented( SystemCallMap *map, Signature signature ) +{ + int i; + bool foundByLabel = true; + + for ( i = 0; signature[i] != NULL && foundByLabel; ++i ) + { + /* if the signature is in the map, its index will be >=0 */ + if ( SystemCallMap_getLabelIndex( map, signature[i] ) < 0 ) + foundByLabel = false; + } + + return( foundByLabel ); +} + + Index: test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/utils.h =================================================================== --- test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/utils.h +++ test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/utils.h @@ -0,0 +1,53 @@ +/************************************************************************* + * + * PathFinder: finding a series of labeled nodes within a + * two-layer directed, cyclic graph. + * Copyright (2013) Sandia Corporation + * + * Copyright (2013) Sandia Corporation. Under the terms of Contract + * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government + * retains certain rights in this software. + * + * This file is part of PathFinder. + * + * PathFinder is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * PathFinder is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with PathFinder. If not, see . + * + * Questions? Contact J. Brian Rigdon (jbrigdo@sandia.gov) + * + */ + +/* + * utils.h + * + * Created on: Jan 10, 2013 + * Author: Brian "Rig" Rigdon, Marcus Smith, Samuel Mulder + */ + +#ifndef UTILS_H_ +#define UTILS_H_ + +#include "graph.h" +#include "systemCallMap.h" +#include "searchDiagram.h" +void edgeListPrettyPrint( EdgeList *edges, int depth, char *header ); +void nodeListPrettyPrint( NodeList *nodes, int depth, char *separator, bool multiLine ); +void graphPrettyPrint( Graph *graph ); +void systemCallMapPrettyPrint( SystemCallMap *map ); +void printStack ( NodePtrVec *stack ); +bool testGraph(); +void testStack(); + +void searchDiagramPrettyPrint ( SearchDiagram *diagram ); + +#endif /* UTILS_H_ */ Index: test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/utils.c =================================================================== --- test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/utils.c +++ test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/utils.c @@ -0,0 +1,252 @@ +/************************************************************************* + * + * PathFinder: finding a series of labeled nodes within a + * two-layer directed, cyclic graph. + * Copyright (2013) Sandia Corporation + * + * Copyright (2013) Sandia Corporation. Under the terms of Contract + * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government + * retains certain rights in this software. + * + * This file is part of PathFinder. + * + * PathFinder is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * PathFinder is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with PathFinder. If not, see . + * + * Questions? Contact J. Brian Rigdon (jbrigdo@sandia.gov) + * + */ + +/* + * utils.c + * + * Created on: Jan 10, 2013 + * Author: Brian "Rig" Rigdon, Marcus Smith, Samuel Mulder + */ + +#include "utils.h" +#include +#include + +void edgeListPrettyPrint( EdgeList *edges, int depth, char *header ) +{ + int i; + for ( i = 0; i < depth; ++i ) + printf( "\t" ); + printf( "%s: ", header ); + for ( ; edges != NULL; edges = edges->nextEdge ) + printf( " %d,", edges->targetNodeId ); + printf( "\n" ); +} + + +void nodeListPrettyPrint( NodeList *nodes, int depth, char *separator, bool multiLine ) +{ + int i; + + if ( !nodes ) + return; + + if ( nodes->node ) + printf( "%d", nodes->node->id ); + if ( nodes->nextNode ) + { + if ( multiLine ) + { + printf( "\n" ); + for ( i = 0; i < depth; ++i ) + { + printf( " " ); + } + } + printf( "%s", separator ); + nodeListPrettyPrint( nodes->nextNode, depth + 1, separator, multiLine ); + } + else + printf( "\n" ); +} + + +void graphPrettyPrint ( Graph *graph ) +{ + NodeList *outerPtr; + NodeList *innerPtr; + + for ( outerPtr = graph->outerNodes; + outerPtr != NULL; + outerPtr = outerPtr->nextNode ) + { + printf( "Outer Node: %d, idx: %d, label: %s (%d)\n", outerPtr->node->id, + outerPtr->node->nodeCount, outerPtr->node->label ? outerPtr->node->label : "none", + outerPtr->node->labelIdx ); + edgeListPrettyPrint( outerPtr->node->edges, 1, "Edges" ); + /* Deprecated: edgeListPrettyPrint( outerPtr->node->entranceNodes, 1, "EntranceNodes" ); */ + for ( innerPtr = outerPtr->node->interiorNodes; + innerPtr != NULL; + innerPtr = innerPtr->nextNode ) + { + printf( "\tInner Node: %d\n", innerPtr->node->id ); + edgeListPrettyPrint( innerPtr->node->edges, 2, "Edges" ); + } + } + + printf ( "\n\n" ); +} + + +void systemCallMapPrettyPrint( SystemCallMap *map ) +{ + SystemCallMapElement *element = NULL; + int i = 0; + int j = 0; + + if ( !map ) + return; + + for ( i = 0; i < map->contentSize; ++i ) + { + element = map->vector[i]; + printf( "'%s'\n\t:", element->label ); + for ( j = 0; element->nodes && j < element->nodes->contentSize; ++j ) + { + printf( "%d", element->nodes->vector[j]->id ); + if ( j < element->nodes->contentSize-1 ) + printf( ", " ); + else + printf( "\n\n" ); + } + + } + + printf( "\t%d total System Call Map elements\n", map->contentSize ); +} + +bool testGraph() +{ + /* Build it and see if it will get made */ + Graph *graph = malloc( sizeof( Graph ) ); + Node *outerNode1 = Node_new( 10, 0 ); + Node *outerNode2 = Node_new( 20, 1 ); + Node *innerNode11 = Node_new( 11, 2 ); + Node *innerNode12 = Node_new( 12, 3 ); + Node *innerNode21 = Node_new( 21, 4 ); + Node *innerNode22 = Node_new( 22, 5 ); + Node *innerNode23 = Node_new( 23, 6 ); + + if ( !graph ) return( false ); + + Graph_addOuterNode( graph, outerNode1 ); + Graph_addOuterNode( graph, outerNode2 ); + + Node_addInteriorNode( outerNode1, innerNode11 ); + Node_addInteriorNode( outerNode1, innerNode12 ); + + Node_addInteriorNode( outerNode2, innerNode21 ); + Node_addInteriorNode( outerNode2, innerNode22 ); + Node_addInteriorNode( outerNode2, innerNode23 ); + + + /* Ok, let's print out the graph and see if it works */ + graphPrettyPrint( graph ); + + return( true ); +} + +void printStack ( NodePtrVec *stack ) +{ + if ( !stack ) return; + int i; + // printf ( "stack size %d out of %d max\n", stack->contentSize, stack->allocatedSize ); + for ( i = 0; i < stack->contentSize; ++i ) + { + printf("%d", stack->vector[i]->id ); + fflush(stdout); + if ( stack->vector[i]->label ) + { + printf( "(%s)", stack->vector[i]->label ); + fflush(stdout); + } + if ( i != stack->contentSize-1 ) + { + printf ( " : " ); + fflush(stdout); + } + } + printf( "\n" ); + fflush(stdout); +} + +void testStack() +{ + /* This was written when the stack was storing integers + int a, b, c, d, e; + printf ( "\n\nTesting stack operations" ); + NodePtrVec *vector = Stack_new(3); + if ( !vector ) + { + printf( "stack allocation failed\n" ); + return; + } + Stack_push( vector, 1 ); + Stack_push( vector, 2 ); + printStack( vector ); + Stack_push( vector, 3 ); + printStack( vector ); + Stack_push( vector, 4 ); + printStack( vector ); + + printf ( "\n2 %s in the stack\n", Stack_find( vector, 2 ) ? "is" : "is not" ); + printf ( "5 %s in the stack\n\n", Stack_find( vector, 5 ) ? "is" : "is not" ); + + printf ( "\n4 %s in the stack\n", Stack_findReverse( vector, 4 ) ? "is" : "is not" ); + printf ( "45 %s in the stack\n\n", Stack_findReverse( vector, 45 ) ? "is" : "is not" ); + + a = Stack_pop( vector ); + printStack( vector ); + b = Stack_pop( vector ); + c = Stack_pop( vector ); + d = Stack_pop( vector ); + e = Stack_pop( vector ); + printStack( vector ); + printf ( "%d, %d, %d, %d, %d\n", a, b, c, d, e ); + */ +} + + +/* The below code gives compile warnings about the size difference + * between pointers and ints. Since this doesn't impact execution, + * I am not going to chase down a fix. + */ +void searchDiagramPrettyPrint ( SearchDiagram *diagram ) +{ +#if 0 + SearchDiagram *node; + EdgeReferences *edge; + + for ( node = diagram; node != NULL && node->node != NULL; ++node ) + { + printf ( "Node %x -> %d\n", (unsigned int)node, node->node->id ); + if ( node->edgeReferenceArray ) + { + printf ( "\t%x\n", (int)node->edgeReferenceArray ); + for ( edge = node->edgeReferenceArray; edge->edgeTarget != NULL; ++edge ) + { + printf ( "\t\tEdge (target %d) -> %x\n", + edge->edgeTarget->id, (int)edge->targetNodeEdges ); + } + } + + } +#endif +} + Index: test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/vectorUtils.h =================================================================== --- test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/vectorUtils.h +++ test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/vectorUtils.h @@ -0,0 +1,169 @@ +/************************************************************************* + * + * PathFinder: finding a series of labeled nodes within a + * two-layer directed, cyclic graph. + * Copyright (2013) Sandia Corporation + * + * Copyright (2013) Sandia Corporation. Under the terms of Contract + * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government + * retains certain rights in this software. + * + * This file is part of PathFinder. + * + * PathFinder is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * PathFinder is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with PathFinder. If not, see . + * + * Questions? Contact J. Brian Rigdon (jbrigdo@sandia.gov) + * + */ + +/* + * vectorUtils.h + * + * Created on: Jun 21, 2013 + * Author: J. Brian Rigdon + */ + +#ifndef VECTORUTILS_H_ +#define VECTORUTILS_H_ + +#include +#include + +#include "node.h" + +/* The IntVector is sort of a C version of std::vector */ +typedef struct IntVectorStruct IntVector; +struct IntVectorStruct +{ + int size; /* number of integers actively stored */ + int allocatedSize; + int *vector; +}; + +IntVector *IntVector_new(int size); /* constructor */ +void IntVector_delete(IntVector *trash); /* destructor */ +#define IntVector_clear(intVectorPtr) (intVectorPtr->size = 0) +#define IntVector_size(intVectorPtr) (intVectorPtr->size) +bool IntVector_insertEnd(IntVector *vector, int datum); + +/* + * parse space-delimited null-terminated string into an IntVector. + * Returns the number of integers collected + */ +int IntVector_createFromString(IntVector *vector, char *inputString); + + + + + +/* The CharVector is sort of a C version of std::vector */ +typedef struct CharVectorStruct CharVector; +struct CharVectorStruct +{ + int size; /* number of integers actively stored */ + int allocatedSize; + char *string; +}; + +CharVector *CharVector_new(int size); /* constructor */ +void CharVector_delete(CharVector *trash); /* destructor */ +bool CharVector_insertEnd(CharVector *vector, char c); +int CharVector_getLineFromFile(CharVector *vector, FILE *input); + + + + + + +/* ------------------------------------------- + * Node Pointer Vector Definitions + * + * NodePtrVec are an alternative storage mechanism to the Node Lists. + * The Vector is single ended, with a push and a pop. It maintains + * a count of contained Node pointers, the maximum allocated size for + * the storage and a pointer to the array of Node pointers. When the + * contained size reaches the maximum, another piece of memory, we + * realloc for twice the size. This is patterned after STL vectors + */ + + + +/* A simple, sized vector class. The vector is initially created with a specified size + * even though it holds nothing. Each push increments a counter (pops decrement) until + * it reaches its initial size. The next push will be slow, because the vector needs + * to grow. At that point, we realloc with DOUBLE the size of the original vector. If + * successful, the last datagram is inserted in the end of the vector. + */ + +typedef struct NodePtrVecStruct NodePtrVec; + +struct NodePtrVecStruct +{ + int contentSize; // the number of elements currently in the vector + int allocatedSize; // the amount (in sizeof int) currently allocated for this vector + Node **vector; // a pointer to the actual data (array of node pointers). +}; + + +NodePtrVec *NodePtrVec_new(int initialSize); /* create a new vector allocating specified size */ +void NodePtrVec_delete(NodePtrVec *trash); /* destructor */ +NodePtrVec *NodePtrVec_copy(NodePtrVec *from, bool exact_copy); /* creates duplicate vector (not duplicate nodes!) */ + +/* pushes the element if it can. If a memory allocation is required but + * fails - false is returned + */ +bool NodePtrVec_push(NodePtrVec *vector, Node *node); +Node * NodePtrVec_pop(NodePtrVec *vector); /* returns the top item and decrements. If empty, we return -1 */ + +/* Screams through the vector from bottom to top to find the specified element. If found, + * returns true. + */ +bool NodePtrVec_find(NodePtrVec *vector, Node *node); + +/* Screams through the vector from top to bottom to find the specified element. If found, + * returns true. + */ +bool NodePtrVec_findReverse(NodePtrVec *vector, Node *node); + +/* Appends the second vector to the first. If the "keepFirst" flag is set, the + * entire second vector is appended to the first. Otherwise, the [0] element of + * the second vector is skipped. This is useful when the last element of the + * first vector is identical to the first element of the second vector, and + * we don't want duplication. (And who, really, wants duplication? Really, who + * wants duplication?) + */ +void NodePtrVec_appendVectors(NodePtrVec *first, NodePtrVec *second, bool keepFirst); + + +/* ------------------------------------------- + * And a vector of Node Pointer Vectors + * + * Results from the searches are presented as NodePtrVectors. To store a bunch of these + * we are defining a vector of these vectors. + */ + +typedef struct NodeVecVecStruct NodeVecVec; + +struct NodeVecVecStruct +{ + int contentSize; + int allocatedSize; + NodePtrVec **vector; +}; + +NodeVecVec *NodeVecVec_new(int initialSize); /* constructor */ +void NodeVecVec_delete(NodeVecVec* trash); /* destructor */ +bool NodeVecVec_insert(NodeVecVec* vector, NodePtrVec* path); /* puts a copy of "path" at the end of the vector */ + +#endif /* VECTORUTILS_H_ */ Index: test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/vectorUtils.c =================================================================== --- test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/vectorUtils.c +++ test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/vectorUtils.c @@ -0,0 +1,563 @@ +/************************************************************************* + * + * PathFinder: finding a series of labeled nodes within a + * two-layer directed, cyclic graph. + * Copyright (2013) Sandia Corporation + * + * Copyright (2013) Sandia Corporation. Under the terms of Contract + * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government + * retains certain rights in this software. + * + * This file is part of PathFinder. + * + * PathFinder is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * PathFinder is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with PathFinder. If not, see . + * + * Questions? Contact J. Brian Rigdon (jbrigdo@sandia.gov) + * + */ + +/* + * vectorUtils.c + * + * Created on: Jun 21, 2013 + * Author: jbrigdo + */ + +#include "vectorUtils.h" + + +#include +#include +#include +#include + + +/* -------- + * IntVector Methods + */ + +/* constructor */ +IntVector *IntVector_new( int size ) +{ + IntVector *new = malloc( sizeof(IntVector) ); + if ( new ) + { + int *vector = malloc ( size * sizeof(int) ); + if ( vector ) + { + new->vector = vector; + new->size = 0; + new->allocatedSize = size; + return( new ); + } + else + { + free( new ); + return( NULL ); + } + } + else + return( NULL ); +} + +/* destructor */ +void IntVector_delete(IntVector *trash) +{ + if ( trash ) + { + if ( trash->vector ) + free( trash->vector ); + free( trash ); + } +} + +/* inserts a new integer at the tail of the vector */ +bool IntVector_insertEnd(IntVector *vector, int datum) +{ + int current = 0; + int max = 0; + + /* some basic error checking */ + if ( !vector ) + return( false ); + + current = vector->size; + max = vector->allocatedSize; + + if ( current == max ) /* we're full */ + { + vector->vector = realloc( vector->vector, 2*max*sizeof(int) ); + if ( vector->vector ) + { + vector->allocatedSize = 2*max; + } + else + { + fprintf( stderr, "\n\nIntVector_insertEnd failed realloc size = %d\n", current*2 ); + return( false ); + } + } + + vector->vector[current] = datum; + vector->size += 1; + return( true ); +} + +/* + * A utility method that takes an input string to the next number. If it currently + * points to a number, we iterate past that number, past any whitespace or non-number + * and point to the first digit character we find. If input currently points a non- + * digit character, we find the next digit character and return a pointer to it. If + * no non-digit character is found with these rules, we return null. + */ +static char *findNextNumber(char *input) +{ + if ( isdigit( (int)input[0] ) ) + { + /* scream through the string to find a non-digit */ + ++input; + while ( isdigit( (int)input[0] ) && *input != '\0' ) + ++input; + if ( input[0] == '\0' ) + return( NULL ); + else + /* now find the next digit */ + while ( !isdigit( (int)input[0] ) && *input != '\0' ) + ++input; + if ( input[0] == '\0' ) + return(NULL); + else + return(input); + } + else + { + /* find the first digit character */ + do { + if ( input[0] == '\0' ) + return(NULL); + ++input; + } while ( !isdigit( (int)input[0] ) ); + return(input); + } +} + +/* + * parse space-delimited null-terminated string into an IntVector. + * Returns the number of integers collected + */ +int IntVector_createFromString(IntVector *vector, char *inputString) +{ + int dataCount = 0; + int datum; + + /* make sure we have valid pointers passed in*/ + if ( !vector || !inputString ) + return(0); + + /* make sure we're pointing to a digit */ + if ( !isdigit((int)inputString[0])) + { + inputString = findNextNumber(inputString); + } + + /* ok, at this point, we know we're pointing at a number */ + while (inputString) /* set to NULL when there are no more numbers. */ + { + datum = atoi(inputString); + inputString = findNextNumber(inputString); + if ( !IntVector_insertEnd(vector, datum) ) + return(0); /* realloc failure */ + ++dataCount; + } + + return(dataCount); +} + + + + +/* constructor */ +CharVector *CharVector_new(int size) +{ + CharVector *new = malloc( sizeof(CharVector) ); + if ( new ) + { + char *string = malloc ( size * sizeof(char) ); + if ( string ) + { + new->string = string; + new->size = 0; + new->allocatedSize = size; + return( new ); + } + else + { + free( new ); + return( NULL ); + } + } + else + return( NULL ); +} + +/* destructor */ +void CharVector_delete( CharVector *trash ) +{ + if ( trash ) + { + if ( trash->string ) + free( trash->string ); + free( trash ); + } +} + + +bool CharVector_insertEnd( CharVector *vector, char c ) +{ + int size = 0; + int max = 0; + + /* some basic error checking */ + if ( !vector ) + return( false ); + + size = vector->size; + max = vector->allocatedSize; + + if ( size == max ) /* we're full */ + { + vector->string = realloc( vector->string, 2*size*sizeof(char) ); + if ( vector->string ) + { + vector->allocatedSize = size*2; + } + else + { + fprintf( stderr, "\n\nIntVector_insertEnd failed realloc size = %d\n", size*2 ); + return( false ); + } + } + + vector->string[size] = c; + vector->size += 1; + return( true ); +} + + +int CharVector_getLineFromFile( CharVector *vector, FILE *input ) +{ + bool notDoneYet = true; + char c = '\0'; + + /* Some basic error checking */ + if ( !vector || !input ) + return( -1 ); + + vector->size = 0; /* reset the vector prior to filling */ + + /* get to the next digit */ + do { + c = fgetc( input ); + if ( feof( input ) || c == '\n' ) + notDoneYet = false; + else + if ( ! CharVector_insertEnd( vector, c ) ) + return( -1 ); /* CharVector_insertEnd reached a memory limit. Fail */ + } while ( notDoneYet ); + + /* make the data a c-string */ + if ( ! CharVector_insertEnd( vector, '\0' ) ) + return( -1 ); /* CharVector_insertEnd reached a memory limit. Fail */ + return( vector->size ); +} + + + +/* ------------------------------------------- + * Node Pointer Vector Method Definitions + * + */ + +/* create a new vector allocating specified size */ +NodePtrVec *NodePtrVec_new( int initialSize ) +{ + NodePtrVec *newVector; + Node **vector; /* an array of pointers */ + + vector = malloc ( initialSize * sizeof(Node *) ); + if ( !vector ) + { + printf ( "Malloc failure in NodePtrVec creation\n" ); + return( NULL ); + } + + newVector = malloc ( sizeof(NodePtrVec) ); + if ( !newVector ) + { + free(vector); + printf ( "Malloc failure in NodePtrVec storage creation\n" ); + return( NULL ); + } + + newVector->allocatedSize = initialSize; + newVector->contentSize = 0; + newVector->vector = vector; + return( newVector ); +} + + + +/* destructor */ +void NodePtrVec_delete( NodePtrVec *trash ) +{ + if ( trash ) + { + if ( trash->vector ) + free(trash->vector); + free(trash); + } +} + + +/* creates duplicate vector (not duplicate nodes!). If exact_copy is true, the + * new vector is the same size as the copied one. If false, then only enough + * room to hold the copy is allocated. + */ +NodePtrVec *NodePtrVec_copy(NodePtrVec *from, bool exact_copy) +{ + int i; + + if ( !from ) + return NULL; + + NodePtrVec *to = exact_copy ? NodePtrVec_new(from->allocatedSize) + : NodePtrVec_new(from->contentSize); + if ( !to ) + return NULL; + + for ( i = 0; i < from->contentSize; ++i ) + to->vector[i] = from->vector[i]; + to->contentSize = from->contentSize; + return to; +} + +/* pushes the element if it can. If a memory allocation is required but + * fails - false is returned + */ +bool NodePtrVec_push( NodePtrVec *vector, Node *node ) +{ + int current; + int max; + + /* some basic error checking */ + if ( !vector ) return false; + + current = vector->contentSize; + max = vector->allocatedSize; + + /* see if our vector is full */ + if ( current == max ) + { + vector->vector = realloc( vector->vector, 2*max * sizeof(Node *) ); + if ( vector->vector ) + { + vector->allocatedSize = 2*max; + } + else + { + printf ( "\n\nNodePtrVec_push failed malloc(%d). Node: %d", 2*max, node->id ); + if ( node->label ) + printf ( ", label: %s\n", node->label ); + else + printf ( "\n\n" ); + return false; + } + } + + /* do the actual pushing */ + vector->vector[current] = node; + vector->contentSize += 1; + + return true; +} + +/* returns the top item and decrements. What do we do to define empty? */ +Node * NodePtrVec_pop( NodePtrVec *vector ) +{ + Node *top = NULL; + + /* some basic error checking */ + if ( !vector ) return NULL; + + if ( vector->contentSize > 0 ) + { + vector->contentSize -= 1; + top = vector->vector[vector->contentSize]; + } + + return top; +} + +/* Screams through the vector from bottom to top to find the specified element. If found, + * returns true. + */ +bool NodePtrVec_find( NodePtrVec *vector, Node *node ) +{ + int i; + + /* some basic error checking */ + if ( !vector ) return false; + + for ( i = 0; i < vector->contentSize; ++i ) + if ( vector->vector[i] == node ) + return true; + + return false; +} + +/* Screams through the vector from top to bottom to find the specified element. If found, + * returns true. */ +bool NodePtrVec_findReverse( NodePtrVec *vector, Node *node ) +{ + int i; + + /* some basic error checking */ + if ( !vector || !vector->vector || !node ) return false; + + for ( i = vector->contentSize-1; i >= 0; --i ) + if ( vector->vector[i] == node ) + return true; + + return false; +} + + +/* Appends the second vector to the first. If the "keepFirst" flag is set, the + * entire second vector is appended to the first. Otherwise, the [0] element of + * the second vector is skipped. This is useful when the last element of the + * first vector is identical to the first element of the second vector, and + * we don't want duplication. (And who, really, wants duplication? Really, who + * wants duplication?) + */ +void NodePtrVec_appendVectors ( NodePtrVec *first, NodePtrVec *second, bool keepFirst ) +{ + int i; + + /* Some basic error checking */ + if ( !first || !second ) + return; + + if ( keepFirst ) + i = 0; + else + i = 1; + + for ( ; i < second->contentSize; ++i ) + NodePtrVec_push( first, second->vector[i] ); +} + + + +/* ------------------------------------------- + * Node Vec Vec Method definitions + * + * (vector of Node Pointer Vectors ) + */ + +/* create a new vector allocating specified size */ +NodeVecVec *NodeVecVec_new( int initialSize ) +{ + NodeVecVec *newVector; + NodePtrVec **vector; /* an array of pointers */ + + vector = malloc ( initialSize * sizeof(NodePtrVec *) ); + if ( !vector ) + { + printf ( "Malloc failure in NodeVecVec storage creation\n" ); + fflush(stdout); + return( NULL ); + } + + newVector = malloc ( sizeof(NodeVecVec) ); + if ( !newVector ) + { + free(vector); + printf ( "Malloc failure in NodeVecVec creation\n" ); + fflush(stdout); + return( NULL ); + } + + newVector->allocatedSize = initialSize; + newVector->contentSize = 0; + newVector->vector = vector; + return( newVector ); +} + + + +/* destructor */ +void NodeVecVec_delete( NodeVecVec *trash ) +{ + int i; + if ( trash ) + { + for ( i = 0; i < trash->contentSize; ++i ) + NodePtrVec_delete(trash->vector[i]); + if ( trash->vector ) + free(trash->vector); + free(trash); + } +} + + +/* pushes a copy of the element if it can. If a memory allocation is required but + * fails - false is returned + */ +bool NodeVecVec_insert( NodeVecVec *vector, NodePtrVec *path ) +{ + int current; + int max; + NodePtrVec *copy = NodePtrVec_copy(path,false); + + /* some basic error checking */ + if ( !vector || !path || !copy ) return false; + + current = vector->contentSize; + max = vector->allocatedSize; + + /* see if our vector is full */ + if ( current == max ) + { + vector->vector = realloc( vector->vector, 2*max * sizeof(Node *) ); + if ( vector->vector ) + { + vector->allocatedSize = 2*max; + } + else + { + printf ( "\n\nNodeVecVec_push failed malloc\n" ); + fflush(stdout); + return false; + } + } + + /* do the actual pushing */ + vector->vector[current] = copy; + vector->contentSize += 1; + + return true; +} + + + Index: test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/yaml.h =================================================================== --- test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/yaml.h +++ test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/yaml.h @@ -0,0 +1,47 @@ +/************************************************************************* + * + * PathFinder: finding a series of labeled nodes within a + * two-layer directed, cyclic graph. + * Copyright (2013) Sandia Corporation + * + * Copyright (2013) Sandia Corporation. Under the terms of Contract + * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government + * retains certain rights in this software. + * + * This file is part of PathFinder. + * + * PathFinder is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * PathFinder is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with PathFinder. If not, see . + * + * Questions? Contact J. Brian Rigdon (jbrigdo@sandia.gov) + * + */ + +/* + * yaml.h + * + * Created on: Jun 21, 2013 + * Author: J. Brian Rigdon + */ + + #ifndef YAML_H + #define YAML_H + + void YAMLOpen(); + void YAMLClose(); + void YAMLWriteString(char *tag, char *data); + void YAMLWriteInt(char *tag, int data); + void YAMLWriteDouble(char *tag, double data); + void YAMLWriteFloat(char *tag, float data); + + #endif /* YAML_H */ \ No newline at end of file Index: test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/yaml.c =================================================================== --- test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/yaml.c +++ test-suite/trunk/MultiSource/Benchmarks/DOE-ProxyApps-C/Pathfinder/yaml.c @@ -0,0 +1,133 @@ +/************************************************************************* + * + * PathFinder: finding a series of labeled nodes within a + * two-layer directed, cyclic graph. + * Copyright (2013) Sandia Corporation + * + * Copyright (2013) Sandia Corporation. Under the terms of Contract + * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government + * retains certain rights in this software. + * + * This file is part of PathFinder. + * + * PathFinder is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * PathFinder is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with PathFinder. If not, see . + * + * Questions? Contact J. Brian Rigdon (jbrigdo@sandia.gov) + * + */ + +/* + * yaml.h + * + * Created on: Jun 21, 2013 + * Author: J. Brian Rigdon + */ + +#include +#include +#include +#include "yaml.h" +static FILE *output = NULL; + +/* This file doesn't yet do a true key/element pair clustering the way YAML is + * intended to do. It is currently a minimalistic approach to output the most + * important data from the run. + */ + +/* In case configuration info isn't passed in... */ +#ifndef CXXFLAGS +#define CXXFLAGS "unknown" +#endif +#ifndef CXXVERSION +#define CXXVERSION "unknown" +#endif + + + + +void YAMLOpen() +{ + time_t rawTime; + struct tm *timeinfo = NULL; + char *fileName = calloc(200, sizeof(char)); + char *timeStr = calloc(200, sizeof(char)); + + + time(&rawTime); + timeinfo = localtime(&rawTime); + + if ( output != NULL || fileName==NULL || timeStr==NULL || timeinfo == NULL ) + return; + + sprintf(fileName, "PathFinder_%d-%d-%d_%d-%d-%d.yaml", timeinfo->tm_year+1900, timeinfo->tm_mon+1, + timeinfo->tm_mday, timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec); + sprintf(timeStr, "%d/%d/%d, %d:%d:%d", timeinfo->tm_year+1900, timeinfo->tm_mon+1, + timeinfo->tm_mday, timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec); + printf("\nWriting YAML: %s\n\n", fileName); + + /* static data - no need to free(timeinfo); */ + + output = fopen(fileName, "w"); + if ( output != NULL ) + { + YAMLWriteString("Mini-Application Name", "PathFinder"); + YAMLWriteString("Mini-Application Version", "1.0.0"); + YAMLWriteString("Run Date/Time", timeStr); + YAMLWriteString("Compiler Version", CXXVERSION); + YAMLWriteString("Compiler Flags", CXXFLAGS); + +#ifdef MPI + YAMLWriteString("MPI", "Yes"); +#else + YAMLWriteString("MPI", "No"); +#endif +#ifdef OPENMP + YAMLWriteString("OpenMP", "Yes"); + YAMLWriteString("Open MP Threads", getenv("OMP_NUM_THREADS")); +#else + YAMLWriteString("OpenMP", "No"); +#endif + + } +} + +void YAMLClose() +{ + if ( output!=NULL ) + fclose(output); +} + +void YAMLWriteString(char *tag, char *data) +{ + if ( output!=NULL ) + fprintf(output, "%s: %s\n", tag, data); +} + +void YAMLWriteInt(char *tag, int data) +{ + if ( output!=NULL ) + fprintf(output, "%s: %i\n", tag, data); +} + +void YAMLWriteDouble(char *tag, double data) +{ + if ( output!=NULL ) + fprintf(output, "%s: %lf\n", tag, data); +} + +void YAMLWriteFloat(char *tag, float data) +{ + if ( output!=NULL ) + fprintf(output, "%s: %f\n", tag, data); +} \ No newline at end of file